- 投稿日:2019-03-10T07:36:36+09:00
② ConoHa VPS で複数WebサーバーとDBサーバーの構成を作る
前回記事:① ConoHa VPS でWebサーバーとDBサーバーを分離する
この記事でやること
今回やることは下記です
- 前回作ったConoha VPSをWebサーバーとして動くようにする
- そこにPHPの簡単なスクリプトを設置
- スクリプトから前回作成したDBサーバーのデータベースに接続して情報を取得
- フロントに表示
- 2つ目のWebサーバーを作る
前回作ったConoha VPSをWebサーバーとして動くようにする
必要なものをyumでざっと入れてしまいます。
まずApacheを入れ、firewallでhttpアクセスを受け付けるようにします。
# yum install httpd -y # firewall-cmd --permanent --zone=public --add-service=httpこの段階でApacheを起動してfirewallを再起動してみます。
# systemctl start httpd # systemctl restart firewalldそしてブラウザで
http://133.130.118.38/
にアクセスしてみると、Apacheのデフォルトの画面が表示されます。PHPのスクリプトから前回作成したDBサーバーのデータベースに接続して情報を取得してフロントに表示
Apacheを入れると、
/var/www
というディレクトリが作成されます。この中のhtml
フォルダにphpのファイルを配置していきます。まずこのフォルダに移動します。
# cd /var/www/html今回簡易的にphpファイルでデータベース接続を行うので、phpと周辺で必要なツールをインストールします。
# yum install php -y # yum install --enablerepo=remi,remi-php70 php-mysqlnd -yここで、私の環境だとブラウザからアクセスしたときにphpが動かなかったので、
httpd.conf
に一部追記をしました。# vi /etc/httpd/conf/httpd.conf
httpd.conf<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>phpファイルを作成します。
# vi index.php
index.php<!DOCTYPE html> <html> <body> <h1>Web Server:1</h1> <?php define('DB_DATABASE','3vptj_test'); define('DB_USERNAME','3vptj_test'); define('DB_PASSWORD','Password1234'); define('PDO_DSN','mysql:host=private.3vptj.tyo1.database-hosting.conoha.io;dbname=' . DB_DATABASE); try{ //DB接続 $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD); $stmt = $db->query("SELECT * FROM fruit"); $result = $stmt->fetch(PDO::FETCH_NUM); print($result[0]); //エラーをスロー $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e){ echo $e->getMessage(); exit; } ?> </body> </html>あまり詳しくこのコードの説明はしませんが、PDOとデータベースへの接続情報を使ってDBサーバー内のデータベースに接続、前回登録したfruitテーブルのappleを表示しているという感じです。
http://133.130.118.38
に接続すると、Web Server:1という文字の下に先程fruitテーブルに登録したappleが表示されます。ちゃんとDBサーバーのデータベースから情報も引っ張ってこれています。
2つ目のWebサーバーを作る
それでは、これまで作ったものと同じ構成のWebサーバーを作成します。
同じ構成のVPSを作る必要があるので、Conohaに戻り、イメージを保存。そしてそのイメージを用いてVPSのコピーを作成します。先程のVPS詳細画面に戻り、サーバーをシャットダウンして、イメージ保存ボタンをクリックします。
続いて
サーバー追加
メニューから、作成したイメージをもとにVPSの作成を行います。(イメージが利用可能になるまで数分かかります)今回はネームタグを
testVPS2
としました。また、IPアドレスは
133.130.110.112
が割り振られました。新しく作ったVPSとDBサーバーとの接続は再度行わないといけないようです。前回の記事と同じ内容なので省略しますが、適宜行ってください。
あと、Apacheをサーバーの起動時に自動的に起動する設定にしていないので
systemctl start httpd
も必要なはずです。このあとロードバランサを入れて振り分け処理が行われていることを視覚的に判断するために、
index.php
を少し変えておきましょう。index.php// <h1>Web Server:1</h1> これを <h1>Web Server:2</h1> // こう書き換えさっそくこのVPSに発行されたIPアドレス
http://133.130.110.112/
にアクセスしてみると、下記のような画面が表示されます。ここでもちゃんとDBサーバーのデータベースから情報も引っ張ってこれています。これでロードバランサを入れる実験の素地ができました。
- 投稿日:2019-03-10T07:36:08+09:00
① ConoHa VPS でWebサーバーとDBサーバーを分離する
最終的にやりたいことと背景
個人で小規模ながらWebサービスを複数個運営していて、本番環境は基本ConohaのVPSにCentOS入れています。
一人でやっているので仕様決めて実装してデプロイして~みたいな一連の流れがサクサク進むのですが、デプロイ時にはサービスを停止するダウンタイムがどうしても発生していて、クリティカルじゃないながらもなんとかしたいと考えています。
色々調べるとCIとかDIとかモダンなやりかたがあるようなのですが、一旦Webサーバーを複数立ててロードバランサでうまく切り替えるなりすることでダウンタイムを無くす方法を勉強してみようと思います。
ロードバランサ入れて複数Webサーバーで切り替えといってもやることは結構あると思っていて、
- WebサーバーとDBサーバーを分離する
- VPSとDBサーバーを構築
- DBサーバーにはデータベースを立てておく
- VPSとDBサーバーを接続
- 複数WebサーバーとDBサーバーの構成を作る
- VPSをWebサーバーとして動くようにする
- そこにPHPの簡単なスクリプトを設置
- スクリプトから前回作成したDBサーバーのデータベースに接続して情報を取得
- フロントに表示
- 2つ目のWebサーバーを作る
- ロードバランサーを導入して複数Webサーバーの割り振り
- Conoha VPSでロードバランサを導入して複数Webサーバーを紐づけ
- Webサーバー側の設定
- ロードバランサによる振り分け実験
あたりが必要になりそうです。
この記事でやること
今回は上記のうち、
- WebサーバーとDBサーバーを分離する
- VPSとDBサーバーを構築
- DBサーバーにはデータベースを立てておく
- VPSとDBサーバーを接続
の部分を進めていきます。
ちなみに今回ほぼこちらの記事通りにすすめています。とてもありがたかったです。
VPSとDBサーバーを構築
一旦VPS一つ、DBサーバー一つをConoha上で構築します。VPSを一つ立てるのですが、まだApacheなどWebサーバー的な要素は加えないので、この記事の中ではVPSと呼んでいきます。
VPSを構築
こちらから新しいVPSを作成します。
構成は最小のもので、OSはCentOSの7.4(最新)を選択。
ネームタグは任意のものにしています。このVPSは後ほどネットワークを作成する時にシャットダウンされている必要があるので、シャットダウンしておきます。
DBサーバーを構築
続いて先程と同じメニューから新しいDBサーバーを作成します。
DBサーバー
タブを選択して、こちらも一応ネームタグを任意のものに変更して作成します。続いて今作成したDBサーバーの詳細画面から設定をしていきます。
まずデータベースを作成します。
ここで設定するデータベース名は後ほど接続の際に利用します。
続いてデータベースに接続するユーザーを作成します。
ここで設定するユーザー名とパスワードも後ほど利用します。
今回はパスワードをPassword1234
としています。さらに、今作成したユーザーが先程作成したデータベースに接続できるように紐づけを行ってあげます。
このタイミングで今作成したデータベースにお手元のクライアント端末PCからアクセスできます。
作成したデータベースを見てみると下記のように、接続先ホスト名が出てきます。このそれぞれのホストですが、
- グローバルネットワーク:外部からの接続時に利用
- プライベートネットワーク:同一ネットワーク内で利用
という用途になってます。
データベースの操作
この時点でもデータベースへの接続は可能なので、グローバルネットワークを使ってターミナルから接続してみます。パスワードは先程のものを使ってください。
$ mysql -h public.3vptj.tyo1.database-hosting.conoha.io -u 3vptj_test -p 3vptj_test下記のように出たら成功です。
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 96478140 Server version: 5.5.5-10.0.19-MariaDB-log MariaDB Server Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.ついでに後ほど接続確認の時に使いたいので、簡単なテーブルとデータを作成しておきます。
create table fruit(name varchar(20)); insert into fruit values ('apple'); select * from fruit;最後のセレクト文の結果が下記のようになっているかと思います。
+-------+ | name | +-------+ | apple | +-------+ 1 row in set (0.11 sec)VPSとDBサーバーを接続
それではConohaに戻り、
プライベートネットワーク
メニュー内のDBサーバー接続用ネットワーク
からVPSをDBサーバーに接続する設定を行います。下記スクショのとおりです。サーバーリストから
testVPS1
を選択してネットワーク情報
を見てみると、表示NIC
に今接続されたDBサーバーが見れるようになっています。ここにある
- IPアドレス
- ゲートウェイ
は後ほどVPSからデータベースに接続するときに活用します。
VPSは起動しておきます。
VPSでの接続設定
ターミナルからSSH接続でVPSに接続します。
ssh root@133.130.118.38
デバイス一覧を確認します。
# nmcli d DEVICE TYPE STATE CONNECTION eth0 ethernet 接続済み eth0 eth1 ethernet 切断済み -- lo loopback 管理無し --今回は
eth1
というデバイスを利用したいのですが切断済みになっているので、networkを再起動します。# systemctl restart network
もう一度デバイス一覧を確認します。
# nmcli d DEVICE TYPE STATE CONNECTION eth0 ethernet 接続済み eth0 eth1 ethernet 接続中 (IP 設定を取得中) Wired connection 1 lo loopback 管理無しの名前を
eth1
とそろえてあげます。# nmcli c m "Wired connection 1" connection.interface-name eth1 connection.id eth1改めて確認すると反映されているのがわかります。
# nmcli d DEVICE TYPE STATE CONNECTION eth0 ethernet 接続済み eth0 eth1 ethernet 接続中 (IP 設定を取得中) eth1 lo loopback 管理無しIPアドレスを設定します。先程の
testVPS1
>ネットワーク情報
>表示NIC
にあったものです。# nmcli c m eth1 ipv4.method manual ipv4.addresses 172.21.139.213/24 connection.autoconnect yes続いてゲートウェイを設定します。これも先程の
testVPS1
>ネットワーク情報
>表示NIC
にあったものです。# nmcli c modify eth1 ipv4.gateway 172.21.138.1
続いてこのネットワーク用の静的ルーティングを設定します。書式は下記です。
ip route add [リージョンのIP] via [ゲートウェイのIP] dev [インタフェース名(例:eth1)]
リージョンのIPは
東京リージョン: (IPアドレスが172.21.***.***の場合)172.21.74.0/23 (IPアドレスが172.29.***.***の場合)172.29.92.0/23 アメリカリージョン: 172.21.92.0/23 シンガポールリージョン: 172.21.110.0/23なので、今回は
172.21.74.0/23
が該当します。コマンドを実行します。
# ip route add 172.21.74.0/23 via 172.21.138.1 dev eth1
もし
RTNETLINK answers: Network is unreachable
と出たら、systemctl restart network
でnetworkを再起動してから実行してください。詳細を確認してみます。
# nmcli d show eth1 GENERAL.DEVICE: eth1 GENERAL.TYPE: ethernet GENERAL.HWADDR: FA:16:3E:4B:B4:5A GENERAL.MTU: 1500 GENERAL.STATE: 100 (接続済み) GENERAL.CONNECTION: eth1 GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/17 WIRED-PROPERTIES.CARRIER: オン IP4.ADDRESS[1]: 172.21.139.213/24 IP4.GATEWAY: 172.21.138.1 IP4.ROUTE[1]: dst = 172.21.139.0/24, nh = 0.0.0.0, mt = 101 IP4.ROUTE[2]: dst = 172.21.138.1/32, nh = 0.0.0.0, mt = 101 IP4.ROUTE[3]: dst = 172.21.74.0/23, nh = 172.21.138.1, mt = 0 IP4.ROUTE[4]: dst = 0.0.0.0/0, nh = 172.21.138.1, mt = 101 IP6.ADDRESS[1]: fe80::1a20:1a60:c9f6:ae0b/64 IP6.GATEWAY: -- IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 101 IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255pingでVPSからDBサーバーに接続できるか試してみます。
# ping -c 3 private.3vptj.tyo1.database-hosting.conoha.io PING private.unit01.database-hosting.tyo1.conoha.io (172.21.74.19) 56(84) bytes of data. 64 bytes from 172.21.74.19 (172.21.74.19): icmp_seq=1 ttl=63 time=3.39 ms 64 bytes from 172.21.74.19 (172.21.74.19): icmp_seq=2 ttl=63 time=0.275 ms 64 bytes from 172.21.74.19 (172.21.74.19): icmp_seq=3 ttl=63 time=0.272 ms --- private.unit01.database-hosting.tyo1.conoha.io ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 0.272/1.315/3.399/1.473 msこのように出ていたら成功です。