NginxでハイパフォーマンスWordPress in SoftLayer
[PR]
Nginx
Nginx(エンジンエックス)は全世界で最も高稼働なWebサイトの実に37%以上に利用され、今も膨大なコンテンツを高速でユーザーに届けている高性能なオープンソースのHTTP Webサーバです。
2002年にオープンソースとして開発が始まり、10年以上を経て多くのユーザ、開発者の貢献によりパフォーマンスと安定性の高さ、豊富な機能、容易な設定、低消費リソースを実現し、多くの支持を得ています。
そんなNginxですが、単にWebサーバとしてだけではなく、ロードバランサやWebアクセラレータとしても活用することが可能です。
Nginxをロードバランサとして利用する場合、いわゆるIPアドレスによる負荷分散を行うL4ロードバランサではなく、URLやHTTPヘッダーで負荷分散が可能なL7ロードバランサとして振る舞います。そのためリクエスト毎にロードバランスするバックエンドを変えるなど、柔軟な設計をとる事が可能です。
Nginxロードバランサの特徴
- URLに基づいたスマートなバランシング決定
- 圧縮、キャッシングなどのWebアクセラレーション
なお、Nginxの商用サポートやロードバランスのリアルタイム監視(デモ)などが必要な場合、NGINX Plusを検討すると良いでしょう。本稿の構成ではコミュニティ版のNginxを利用しますが、NGINX Plusはコミュニティ版の設定をそのまま利用することも可能です。
構築概要
今回は次の様なシステムを構築してみたいと思います。まずはスモールスタートで……ということで、Nginxで2台のWordPressサーバをロードバランスする構成です。
フロントにロードバランサとしてNginxを1台、裏にWordPressを実行させるWebサーバを2台、そしてDBサーバとしてMariaDB(MySQLと互換性を持つDB)といったシンプルな構成です。
構築
Step1:サーバのオーダー
まずはSoftLayerのポータルからDevice(サーバ)を4台オーダーしましょう。今回は1Core、1GBメモリ、回線は100Mbpsの最小構成の仮想マシンをオーダーしています。
本稿で紹介する構成は、構築スクリプトをGitHubに公開しているので、それをそのままProvisioning Scriptに指定すれば簡単にできあがるようになっています。
オーダーの注意点(必須)
- CentOS7.xの最小構成を選ぶ(LAMP構成やDB構成ではなく、4台とも最小構成を選んでください)
- 4台のサーバーが同じVLANを利用すること
- SSH Keysを指定する
- Provisioning Scriptに対応するスクリプトを指定する
lb01:Nginxのロードバランサ
https://raw.githubusercontent.com/kazuhisya/SL-Scripts/master/centos_el7_nginx_lb
wp01、wp02:WordPressのWebサーバ1・2
https://raw.githubusercontent.com/kazuhisya/SL-Scripts/master/centos_el7_nginx_wp
db01:MariaDBのDBサーバ
https://raw.githubusercontent.com/kazuhisya/SL-Scripts/master/centos_el7_mariadb
Step2:初期設定(LB)
サーバが利用できるようなったら、SSH Keysに指定した鍵を使いrootユーザでロードバランサにログインします。Provisioning Scriptにより、既にNginxがインストール済みの状態になっているはずです。
ここからロードバランスの設定を行っていきましょう。/etc/nginx/conf.d/default.confを確認してください。
upstream backend { # your servers server <WP01 IP>; server <WP02 IP>; } server { 〜〜 中略 〜〜 location /wp-admin { # only 1st server proxy_pass http://<WP01 IP>/wp-admin; 〜〜 中略 〜〜 }
Nginxをロードバランサとして利用するときは、このupstreamディレクティブで接続先を指定します。
location/wp-adminでは、WordPressの管理画面の振り先を指定します。今回の構成では、各WordPressのコンテンツ(画像や設定、プラグインなど)は2台のサーバ間で共有されていません。そのため、管理画面は片側のサーバだけに振り分けて手動で対応していきます。
編集できたら以下のコマンドでNginxを再起動します。
[root@lb01 ~]# systemctl restart nginx.service
Step3:初期設定(DB)
次にDBサーバにsshでログインします。なおDBサーバもProvisioning ScriptによりMariaDBのインストール及びWordPress用DBおよびユーザは既に作成済みです。
ここでは、DBに接続するためのパスワードをメモしておきましょう。
[root@db01 ~]# cat /root/db_password.txt XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Step4:初期設定(WP)
WordPressサーバにsshでログインします。お気づきかもしれませんが既にこのサーバもProvisioning ScriptによりWordPressのインストール及び、それを動かすためのNginx、php、php-fpmが導入済みです。
ここでは、WordPressの設定ファイルを作っていきましょう。サンプルの設定ファイルをコピーします。(wp01、wp02共に実施)
[root@wp01 ~]# cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
中身を以下の様に編集します。(以下抜粋)
/** WordPress のためのデータベース名 */ define('DB_NAME', 'wordpress'); /** MySQL データベースのユーザー名 */ define('DB_USER', 'wordpress'); /** MySQL データベースのパスワード */ define('DB_PASSWORD', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); /** MySQL のホスト名 */ define('DB_HOST', 'XXX.XXX.XXX.XXX');
- WordPressのためのデータベース名:wordpress
- MySQLデータベースのユーザー名:wordpress
- MySQLデータベースのパスワード:DBサーバの/root/db_password.txtの中身
- MySQLのホスト名:DBサーバのPrivate IP
また、以下の箇所に関してはWordPress.orgの秘密鍵生成サービスをブラウザから開き書き換えましょう。このユニークキーもDBの設定と同じく、両サーバであわせる必要があります。
/**#@+ * 認証用ユニークキー * * それぞれを異なるユニーク(一意)な文字列に変更してください。 * {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。 * 後でいつでも変更して、既存のすべての cookie を無効にできます。これにより、すべてのユーザーを強制的に再ログインさせることになります。 * * @since 2.6.0 */ define('AUTH_KEY', 'put your unique phrase here'); define('SECURE_AUTH_KEY', 'put your unique phrase here'); define('LOGGED_IN_KEY', 'put your unique phrase here'); define('NONCE_KEY', 'put your unique phrase here'); define('AUTH_SALT', 'put your unique phrase here'); define('SECURE_AUTH_SALT', 'put your unique phrase here'); define('LOGGED_IN_SALT', 'put your unique phrase here'); define('NONCE_SALT', 'put your unique phrase here');
Step5:WordPressセットアップ
WordPressの残りのセットアップはブラウザから行います。ブラウザからNginxロードバランサのPublic IPを開いてWordPressのインストールウィザードを進めてください。
最後まで進むと、以下の様な画面に切り替わります。