読者です 読者をやめる 読者になる 読者になる

webサーバー1とwebサーバー2からマスタDBサーバーに外部接続できるようにする

マスタDBの現在のMySQLユーザーはこうなってます。

mysql> SELECT user, host FROM mysql.user ORDER BY user, host;

+-----------+-----------+

| user      | host      |

+-----------+-----------+

| mysql.sys | localhost |

| root      | localhost |

+-----------+-----------+

2 rows in set (0.00 sec)

 

外部接続するmaster_dataというdatabaseを作成しておきます。

mysql> create database master_data;

 

・webサーバー1からアクセスできるMySQLユーザーを追加します。

master_dataというデータベース全体にselect、insert、update、deleteができる権限をweb1ユーザーに与えます。

mysql>  GRANT SELECT, INSERT, UPDATE, DELETE ON master_data.* TO 'web1'@'webサーバー1のIPアドレス' IDENTIFIED BY 'パスワード';

・ユーザー追加を反映する。

mysql> flush privileges;

 

・ユーザーが追加されたことを確認する

mysql> SELECT user, host FROM mysql.user ORDER BY user, host;

・権限が付与されているかも確認する

mysql> show grants for 'web1'@'webサーバー1のIPアドレス';

 

・マスタDBサーバーの3306ポートを開けます。

vi /etc/sysconfig/iptables

-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPTを追加。

他のサーバーの設定時と同様にiptablesをインストールし起動します。

 

・webサーバー1でmysqlコマンドを使用するためmysqlもインストールしておきます。

 

・webサーバー1からマスタDBサーバーのDBにアクセスできるか確認します。

mysql -u web1 --password="パスワード" -h マスタDBのIPアドレス master_data

これでマスタDBのMySQLに入れれば成功です。

 

webサーバー2も同じことを行います。

マスタDBサーバーの設定をする

次にマスタDBのサーバー設定をします。

これでもうサーバーの契約は4台目です。笑

 

 まずMySQLをインストールします。

MySQLリポジトリを追加

sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

MySQLのインストール

sudo yum -y install mysql-community-server

mysqlサーバーのバージョン確認

mysqld --version

mysqlクライアントのバージョン確認

mysql --version

 

/etc/my.cnfの設定ファイルに以下の内容を追加します。

character-set-server=utf8(デフォルトの文字コードをUTF8にする)

default_password_lifetime=0(パスワードの期限が360日なので、変更しなくてもいいようにする)

 

・次にMySQLを起動と自動起動の設定をします。

sudo systemctl start mysqld.service

sudo systemctl enable mysqld.service

sudo systemctl status mysqld.service

 

MySQLの初期パスワードを確認する。

sudo 

cat /var/log/mysqld.log | grep 'temporary password'を叩き、

[Note] A temporary password is generated for root@localhost: hogehoge

と表示される「hogehoge」部分が初期パスワードとなります。

・初期パスワードを変更する。

mysql_secure_installationを叩くと、対話形式でパスワード変更ができます。

rootユーザーのパスワードの変更、

ポリシーに沿ったrootユーザーパスワードの設定(記号、大文字、小文字、数字を含んだ文字列)

anonymousユーザーの削除(yを入力)

リモートホストからrootユーザーでログインするのを禁止する(yを入力)

testデータベースの削除(yを入力)

を順に入力していきます。

 

mysql -u root -pで先ほど変更したパスワードでログインできれば成功です。

 

 

ロードバランサにきたリクエストをwebサーバー1とwebサーバー2へ振り分けできるようにする

まず、webサーバー2の設定をします。

webサーバー1と同じく、Nginxとphp-fpmのインストールまでします。

webサーバー2のIPアドレスへアクセス時の画像は以下のように背景を黄色にします。

f:id:free_programmer:20170212195650p:plain

 

 

次にwebのロードバランサにきたリクエストをwebサーバー1とwebサーバー2に流せるように設定します。

ちなみにNginxのロードバランシングの方法は以下の3種類があります。

1、ラウンドロビン

アプリケーションへのリクエストはラウンドロビンの形式で分配されます。何も設定していない時のデフォルトはラウンドロビンになります。

2、Least Connected

接続数が少ないサーバーに振り分ける方法。

3、IPハッシュ

同じIPアドレスからのアクセスを同じサーバーに振り分ける方法。サーバーが利用不可の場合を除いて常に同じサーバーに渡されることを保証します。なお、接続先のサーバーが利用不可の場合は他のサーバーに渡させる動きをします。

 

今回はラウンドロビンの設定にします。

/etc/nginx/にあるnginx.confのhttpブロックの中に以下を追加します。

upstream ロードバランサのIPアドレス{

        server webサーバー1のIPアドレス;

        server webサーバー2のIPアドレス;

    }

 

    server {

       listen 80;

       location / {

          proxy_pass http://ロードバランサのIPアドレス;

       }

    }

 

Nginxを再起動します。

sudo systemctl restart nginx.service

 

これで、http://ロードバランサのIPアドレスにアクセスすると交互にwebサーバー1の赤い画面とwebサーバー2の黄色い画面が表示されれば疎通成功です。

ちなみにwebサーバー2のNginxをstopさせるとwebサーバー1のみ表示されるようになり、サーバーが利用不可の時も問題なく生きてるサーバーへ振り分けられます。

2台目のサーバー設定をする(webサーバー1)

2台目としてサーバー構成図のwebサーバー1の設定をします。

PHPアプリケーションを動かすwebサーバーで、

今回はapacheではなくNginx上でPHPが動くようにしたいと思います。

なので、Nginxのインストールまでは1台目と同じ手順です。

ちなみにwebサーバー1のユーザー名はweb1という名前で追加しました。

 

Nginxのインストールまで終われば、次にNginx上でPHPを動かすために必要なPHP-FPMをインストールします。

まず、yumリポジトリphp-fpmがあるか確認

sudo yum list | grep php-fpm

あればインストール

sudo yum -y install php-fpm

インストールできたか確認

php-fpm -v

PHP5.4が入ってました。

 

PHP-FPMの設定ファイルにはデフォルトがapacheの設定になっているのでuserとgroupの「apache」を「nginx」に書き換えます。

/etc/php-fpm.d/www.conf
- user = apache
+ user = nginx

- group = apache
+ group = nginx

 

 

次に、nginxの設定ファイル中の、ドキュメントルートの設定とPHPを実行できるように書き換えます。

※デフォルトの設定ファイルはコピーして残します。

sudo cp default.conf default.conf.org

/etc/nginx/conf.d/default.conf
  location / {
-     root   /usr/share/nginx/html;
+     root   /var/www;
-     index  index.html index.htm;
+     index  index.php;
  }

- #location ~ \.php$ {
- #    root           html;
- #    fastcgi_pass   127.0.0.1:9000;
- #    fastcgi_index  index.php;
- #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
- #    include        fastcgi_params;
- #}
+ location ~ \.php$ {
+     root           /var/www;
+     fastcgi_pass   127.0.0.1:9000;
+     fastcgi_index  index.php;
+     fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
+     include        fastcgi_params;
+ }

 

PHP-FPMの起動と自動起動の設定

sudo systemctl start php-fpm

sudo systemctl enable php-fpm

sudo systemctl status php-fpm

 

・Nginxも設定ファイルを修正したので再起動

sudo systemctl restart nginx.service

 

・設定したドキュメントルートにindex.phpを作る。

/var/www/index.php

<html>

<body bgcolor="#ff0000">

<h4>web1 access!!</h4>

</body>

</html>

 

ブラウザから「http://webサーバー1のIPアドレス」にアクセスして、

f:id:free_programmer:20170212195428p:plain

この画像が表示されれば、PHP-FPMの設定は成功です。

 

1台目のサーバー設定をする(webのロードバランサ)

ServersManのVPSシンプルプランで契約しました。

・とりあえずrootで入ります。(ssh接続できるポート番号がメールに記載されています)

ssh -p 3843 root@IPアドレス

・root以外の管理者ユーザーを作成してパスワードを設定

useradd -G wheel lb_web

passwd lb_web

・作成した管理者ユーザーでログインして、sudoコマンドが使えることを確認

ssh -p 3843 lb_web@IPアドレス

sudo su -

 

Nginxをインストールしていきます。

・Nginxのリポジトリのインストール

sudo yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

 

・Nginxのパッケージのインストール

sudo yum -y install --enablerepo=nginx nginx

 

・インストールされた確認

nginx -v

 

http://IPアドレス」にアクセスするとServersManのVPSシンプルプランの場合、Apacheがインストールされているので、今回はNginxを使いたいためApacheを停止させます。

sudo systemctl stop httpd

 

iptablesのインストール

sudo yum -y install iptables-services

・80番ポートの開放

/etc/sysconfig以下にあるiptablesのファイルに一行追記します。

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

COMMIT

iptablesの起動と自動起動の設定

sudo systemctl start iptables

sudo systemctl enable iptables

sudo systemctl status iptables

 

・Nginxの起動と自動起動の設定

sudo systemctl start nginx.service

sudo systemctl enable nginx.service

sudo systemctl status nginx.service

 

iptablesとNginxの自動起動設定が正常に設定されているか確認

sudo systemctl list-unit-files -t service | grep -e iptables -e nginx

 

http://IPアドレスにアクセスして、「Welcome to nginx!」が表示されていれば成功。

 

 

ソーシャルゲームのサーバーを構築してみた1(サーバーの構築案)

大規模サービスのサーバー周りの知識を身につけるため、

自分で負荷分散のことも考えたソーシャルゲームのサーバー設計を構築してみることにしました。

 

以下のようなかんじで作ります。

(私はソーシャルゲーム新規立ち上げ開発から関わったことはありますが、サーバーは用意されていたし、その時はまだサーバー構成に興味がなかったので、うっすら覚えている程度です。)

 

                                                          Client

                                                              |

                                                   LoadBlancer(Nginx)

                                                       |                |                   |

                                        WebServer1   WebServer2   WebServer3

                                                     |                                    |

                                             DB_Master   スレーブDB用のLoadBlancer(Nginx)

                                                                                      |             |               |

                                                                         DB_Slave1   DB_Slave2   DB_Slave3

 

クライアント(アプリやブラウザ)からリクエストが飛んできて、

それを負荷分散させるためにロードバランサ(最近流行り?のNginxを使う)で3台のWebサーバーに振り分ける。

DBはマスタDBとスレーブDBのレプリケーション設定にする。

複数台のスレーブDBへのリクエストを振り分けるようのロードバランサも間に挟む。

DBの垂直分割としてログ関連のマスタDBはDB_Masterの並列にもう1台あってもいいかも。

 

今風のソシャゲのサーバー構成はこんなかんじだろうか。

これでユーザー数が増えてさらに負荷が大きくなっても、WebサーバーとスレーブDBを並列に追加して対応する想定です。

Webサーバーは全部ApacheではなくNginxで動かします。NginxだけだとPHPが動かないのでPHP-FPMも入れます。

でもロードバランサってこんなにも必要なのかな。。。。

あとは実際の現場だとキャッシュ用のサーバーやバッチ用のサーバーもあります。

 

とりあえず、全部でサーバーが9台必要です。笑

格安のVPSを探したらServersmanってとこがサーバー1台が月500円なので、

そこで契約してみることにします!

次回から1台ずつ構築していく様子を書いていきます。