① 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サーバーを接続

の部分を進めていきます。  
  
ちなみに今回ほぼ[こちらの記事](https://hombre-nuevo.com/vps/vps0007/)通りにすすめています。とてもありがたかったです。

# VPSとDBサーバーを構築

一旦VPS一つ、DBサーバー一つをConoha上で構築します。VPSを一つ立てるのですが、まだApacheなどWebサーバー的な要素は加えないので、この記事の中ではVPSと呼んでいきます。

## VPSを構築

[こちら](https://manage.conoha.jp/Service/Create/)から新しいVPSを作成します。

![スクリーンショット 2019-03-09 18.38.22.png](https://qiita-image-store.s3.amazonaws.com/0/113133/94e9ea17-5075-de13-3434-5d1f39430abb.png)

構成は最小のもので、OSはCentOSの7.4（最新）を選択。
ネームタグは任意のものにしています。

このVPSは後ほどネットワークを作成する時にシャットダウンされている必要があるので、シャットダウンしておきます。

## DBサーバーを構築

続いて[先程と同じメニュー](https://manage.conoha.jp/Service/Create/)から新しいDBサーバーを作成します。

`DBサーバー`タブを選択して、こちらも一応ネームタグを任意のものに変更して作成します。

![スクリーンショット 2019-03-09 18.43.39.png](https://qiita-image-store.s3.amazonaws.com/0/113133/ee4a1fb9-c892-9046-d872-1463f7c250cb.png)

続いて今作成したDBサーバーの詳細画面から設定をしていきます。

まずデータベースを作成します。

![スクリーンショット 2019-03-09 18.48.04.png](https://qiita-image-store.s3.amazonaws.com/0/113133/c46d7f59-83df-cd2c-7a90-52ef4a3bde8f.png)

ここで設定するデータベース名は後ほど接続の際に利用します。

続いてデータベースに接続するユーザーを作成します。

![スクリーンショット 2019-03-09 18.49.17.png](https://qiita-image-store.s3.amazonaws.com/0/113133/f25beed1-3127-a965-ad4e-cdd31ace8e66.png)

ここで設定するユーザー名とパスワードも後ほど利用します。
今回はパスワードを`Password1234`としています。

さらに、今作成したユーザーが先程作成したデータベースに接続できるように紐づけを行ってあげます。

![スクリーンショット 2019-03-09 19.01.35.png](https://qiita-image-store.s3.amazonaws.com/0/113133/0d347c31-4a3d-dca9-b292-e07ccdea0249.png)

このタイミングで今作成したデータベースにお手元のクライアント端末PCからアクセスできます。
作成したデータベースを見てみると下記のように、接続先ホスト名が出てきます。

![スクリーンショット 2019-03-09 18.51.32.png](https://qiita-image-store.s3.amazonaws.com/0/113133/f4123052-6f07-0180-5a48-9c70db736473.png)

このそれぞれのホストですが、

- グローバルネットワーク：外部からの接続時に利用
- プライベートネットワーク：同一ネットワーク内で利用

という用途になってます。

## データベースの操作

この時点でもデータベースへの接続は可能なので、グローバルネットワークを使ってターミナルから接続してみます。パスワードは先程のものを使ってください。

```terminal
$ 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.
```
ついでに後ほど接続確認の時に使いたいので、簡単なテーブルとデータを作成しておきます。

```sql
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サーバーに接続する設定を行います。下記スクショのとおりです。

![スクリーンショット 2019-03-09 19.17.45.png](https://qiita-image-store.s3.amazonaws.com/0/113133/b29da077-758c-b7f0-f342-5e34af517b45.png)

サーバーリストから`testVPS1`を選択して`ネットワーク情報`を見てみると、`表示NIC`に今接続されたDBサーバーが見れるようになっています。

![スクリーンショット 2019-03-09 19.21.31.png](https://qiita-image-store.s3.amazonaws.com/0/113133/77694c45-c734-f377-50b2-97e4857afab8.png)

ここにある

- IPアドレス
- ゲートウェイ

は後ほどVPSからデータベースに接続するときに活用します。

VPSは起動しておきます。

# VPSでの接続設定

ターミナルからSSH接続でVPSに接続します。

```terminal
ssh root@133.130.118.38
```

デバイス一覧を確認します。

```terminal
# nmcli d 
DEVICE  TYPE      STATE    CONNECTION 
eth0    ethernet  接続済み  eth0       
eth1    ethernet  切断済み  --         
lo      loopback  管理無し  --  
```

今回は`eth1`というデバイスを利用したいのですが切断済みになっているので、networkを再起動します。

```terminal
# systemctl restart network
```

もう一度デバイス一覧を確認します。

```terminal
# nmcli d 
DEVICE  TYPE      STATE                  CONNECTION         
eth0    ethernet  接続済み                eth0               
eth1    ethernet  接続中 (IP 設定を取得中)  Wired connection 1 
lo      loopback  管理無し  
```
の名前を`eth1`とそろえてあげます。

```terminal
# nmcli c m "Wired connection 1" connection.interface-name eth1 connection.id eth1
```

改めて確認すると反映されているのがわかります。

```terminal
# nmcli d
DEVICE  TYPE      STATE                  CONNECTION 
eth0    ethernet  接続済み                eth0       
eth1    ethernet  接続中 (IP 設定を取得中)  eth1       
lo      loopback  管理無し  
```

IPアドレスを設定します。先程の`testVPS1`>`ネットワーク情報`>`表示NIC`にあったものです。

```terminal
# nmcli c m eth1 ipv4.method manual ipv4.addresses 172.21.139.213/24 connection.autoconnect yes
```

続いてゲートウェイを設定します。これも先程の`testVPS1`>`ネットワーク情報`>`表示NIC`にあったものです。

```terminal
# 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`が該当します。

コマンドを実行します。

```terminal
# ip route add 172.21.74.0/23 via 172.21.138.1 dev eth1
```

もし`RTNETLINK answers: Network is unreachable`と出たら、`systemctl restart network`でnetworkを再起動してから実行してください。

詳細を確認してみます。

```terminal
#  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=255
```

pingでVPSからDBサーバーに接続できるか試してみます。

```terminal
# 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
```

このように出ていたら成功です。

次回記事：[② ConoHa VPS で複数WebサーバーとDBサーバーの構成を作る](https://qiita.com/mtitg/items/1fec73fa063e9b8b6372)