NginxでハイパフォーマンスWordPress in SoftLayer
性能検証
WordPressのセットアップが終わったところで、その性能を少し確認してみたいと思います。
単体性能
まずは単体での検証です。手元のマシンからインターネット経由でwp01のPublic IPへ負荷を掛けて見ます。検証に利用したコマンドは以下です。/?p=1はサンプルで登録してあるWordPressの Hello world! ページです。
$ ab -c 100 -n 1000 http://<WP01 IP>/?p=1
Document Path: /?p=1 Document Length: 11681 bytes Concurrency Level: 100 Time taken for tests: 170.809 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 11943000 bytes HTML transferred: 11681000 bytes Requests per second: 5.85 [#/sec] (mean) Time per request: 17080.887 [ms] (mean) Time per request: 170.809 [ms] (mean, across all concurrent requests) Transfer rate: 68.28 [Kbytes/sec] received
1秒あたり5.85リクエスト捌けているようですね。
LB性能
次に手元のマシンからlb01のPublic IPへ、つまり2台のロードバランスでの検証を行います。なお、負荷条件は同じです。
$ ab -c 100 -n 1000 http://<LB01 IP>/?p=1
Document Path: /?p=1 Document Length: 11681 bytes Concurrency Level: 100 Time taken for tests: 84.188 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 11943000 bytes HTML transferred: 11681000 bytes Requests per second: 11.88 [#/sec] (mean) Time per request: 8418.760 [ms] (mean) Time per request: 84.188 [ms] (mean, across all concurrent requests) Transfer rate: 138.54 [Kbytes/sec] received
1秒あたり11.88リクエスト捌けています。このケースではロードバランサの性能劣化はほとんど見られず、概ね2倍、しっかりスケールアウトして意図する性能が得られていますね。
キャッシングで更に高速化
ここまででNginxをロードバランサとして利用できるようになりましたが、もう一歩踏み込んでロードバランサにキャッシングの機能を追加してみましょう。
キャッシュがない場合バックエンドにアクセスを振り分け、キャッシュがある場合はフロントエンドのNginxから直接キャッシュを返す構成です。このような構成にすることで、PHPやDBへのアクセスが減り、更なるレスポンス高速化が見込めます。
このキャッシングの機能はロードバランサやリバースプロキシとしてNginxを利用した際の醍醐味の一つでもあります。
設定サンプルを/etc/nginx/conf.d/default.cache.exampleとして設置してあるので、以下の様に設定を入れ替えて、初期設定(LB)の項目と同じくバックエンドのIPを書き換えましょう。
[root@lb01 ~]# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org [root@lb01 ~]# cp /etc/nginx/conf.d/default.cache.example /etc/nginx/conf.d/default.conf
編集し終わったら、同じようにNginxの再起動をしておきます。
[root@lb01 ~]# systemctl restart nginx.service
準備が整ったら、一度負荷を掛けるページにアクセスして、キャッシュに載せましょう。
$ curl http://<LB01 IP>/?p=1
キャッシュができあがっているか確認しましょう。キャッシュは/var/cache/nginx/cache/以下に出来上がるように設定されています。
[root@lb01 ~]# tree -A /var/cache/nginx/cache/ /var/cache/nginx/cache/ └── X └── XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1 directory, 1 file
キャッシュが出来上がっていることも確認できたので、負荷を掛けて見ましょう。
Document Path: /?p=1 Document Length: 11681 bytes Concurrency Level: 100 Time taken for tests: 0.917 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 11958625 bytes HTML transferred: 11695577 bytes Requests per second: 1089.98 [#/sec] (mean) Time per request: 91.745 [ms] (mean) Time per request: 0.917 [ms] (mean, across all concurrent requests) Transfer rate: 12729.13 [Kbytes/sec] received
1秒あたり1089.98リクエスト捌けていますね。なんと100倍近い高速化が出来ました。Transfer rateも手元の環境からのインターネット計測にもかかわらず、12729.13[Kbytes/sec]と、ほぼ100Mbpsの帯域を使い切れたようですね。
キャッシュに載りきっている場合これだけ高速化が可能ということですね。キャッシュが既にある場合、フロントで高速にコンテンツを返し、ない場合は2台のバックエンドに振り分ける理想的な環境が出来上がりました。
なお、よりアクセスが集中する場合やバックエンドが増えた場合、Nginx のロードバランサ自体がボトルネックになってくる事があります。
Nginx は傾向としてメモリよりも CPU 資源を利用する傾向があるので、仮想マシンであればコア単位でアップグレードが可能な SoftLayerの大きなアドバンテージと言えそうです。さらに、よりパフォーマンスが必要になった場合、仮想化のオーバーヘッドを気にせず CPU性能をフルに発揮できるベアメタルサーバを簡単にオーダーできるのも魅力です。
まとめ
本稿ではSoftLayerでNginxロードバランサを利用したWordPressサイト構築の概要について記載しました。更に踏み込んだ内容として管理画面のSSL化や、振り分けた2台のWordPressサーバのコンテンツ共有、SoftLayerのCDN機能を用いた高速化など、手を加えることは沢山あるでしょう。
Nginxのスケールアウト構成は市販のロードバランサ等と比べると、駆け出しのエンジニアでも比較的取り組みやすく、キャッシングなどをうまく活用することで驚くほどの性能を発揮できるのでお勧めです。この機会に触れてみてはいかがでしょうか。