WordPress高速化: nginxとphp-fpmの最適化

Tablet PC deals and Promotion
高速化

前回はWordpressで構築したWebサイトが、Webサーバーを帰ることによってどのようにパフォーマンスが変化するのかを確認しました。

その結果、nginxによって若干高速化するものの、もはやボトルネックはhtmlデータを作る処理(PHPとMySQL)にあることがわかりました。

今回はnginxとphp-fpmを最適化し、高速化を狙ってみます。

php-fpmの最適化

Debian 6.0(Squeeze)ではphp-fpmの設定値は/etc/php5/fpm/pool.dにあるファイルを変更することによって行います。

何を変えたらよいのかイマイチわかりませんが、下記のページにメモリ512MB~1GBのVPSで試した結果見つけた設定値というのが載っています。

私の契約しているServersMan@VPS>のスタンダードコースは、最低保証メモリが1.2GBなのでほぼこれを使えそうな感じです。しかし、何度か試してみたところ、ServersMan@VPSでは、同時に立ち上がるプロセス数が少ないほうが性能が良いことがわかりました。結局、下記の設定にしています。

pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500

また、上記ページには安定性を増すためにお勧めの設定として

request_terminate_timeout = 30s

というのも紹介されています。とりあえずこれも試してみます。

設定の変更は/etc/php5/fpm/pool.d/www.confの該当部分を上記数値に書き換えることで行います。

nginxの最適化

nginxとphp-fpm間の通信方法をTCPソケットからUnixドメインソケットに変更してみます。Unixドメインソケットの方が処理が軽いことが期待できます。

このためにはまずphp-fpmの方の設定変更も必要です。先ほどのwww.confのlistenという行を次のように書き換えます。

listen = /var/lib/php5/php-fpm.sock

さらにnginxの設定ファイルで127.0.0.1:9000となっているところを次のように書き換えます。

unix:/var/lib/php5/php-fpm.sock

私の場合は、/etc/nginx/conf.d/にphp-fpm.confを作成して次のような内容にしています。

upstream php {
    server unix:/var/lib/php5/php-fpm.sock;
}

そしてこれを個々のサイトの設定(あるいはWordpress共通の設定)で

fastcgi_pass php;

として取り込んでいます。上記のようにupstreamを使っていない人は

fastcgi_pass unix:/var/lib/php5/php-fpm.sock;

とすると良いでしょう。

設定を有効にする

設定を有効にするためにはphp-fpmとnginxを再起動します。

sudo /etc/init.d/php5-fpm restart
sudo /etc/init.d/nginx restart

効果の測定

前回同様トップページと個別ページをpingdomというサイトとApacheに付属するabコマンドで測定してみます。

トップページの結果

pingdomでトップページ(http://scratchpad.jp/)を計測した結果は次のようになりました。最適化前のLoad timeは5.53秒です。ただし何度か実行したところ、最適化後でも6秒近くなるときもありました。

トップページ

htmlデータの読み込み時間の内訳は次の通りです。読み込みに1.93秒かかり、そのうち1.39秒が待ち時間(Webサーバ側でのデータ準備時間)でした。最適化前はそれぞれ2.70秒と1.45秒です。

トップページ分析

「ab –n 100 –c 10 http://scratchpad.jp/」を実行した結果は次のようになりました。カッコ内は最適化前の数字です。ほんのわずかだけ若干性能が向上したようです。

Faild Request 0 (0) (小さいほうが良い)
Request per socond 1.15 [#/sec] (1.05) (大きいほうが良い)
Time per request 870.808 [ms] (948.879) (小さいほうが良い)
Transfer rate 84.36 [KB/sec] (77.43) (大きいほうが良い)

単一記事の結果

次にhttp://scratchpad.jp/google-nexus7-42/の測定結果です。最適化前のLoad timeは8.69秒です。

単一記事

htmlデータの読み込み時間の内訳は次の通りです。読み込みに4.71秒かかり、そのうち3.63秒が待ち時間(Webサーバ側でのデータ準備時間)でした。最適化前はそれぞれ4.31秒と3.62秒です。

単一記事分析

「ab –n 100 –c 10 http://scratchpad.jp/google-nexus7-42/」を実行した結果は次のようになりました。カッコ内は最適化前の数字です。こちらはFaild Requestが増えたもののその他の項目は改善しているようです。

Faild Request 24(2) (小さいほうが良い)
Request per socond 1.02 [#/sec] (0.66) (大きいほうが良い)
Time per request 985.096 [ms] (1521.908) (小さいほうが良い)
Transfer rate 97.47 [KB/sec] (63.09) (大きいほうが良い)

まとめ

今回はphp-fpmとnginxの設定値を見直して高速化を狙ってみました。

しかし効果は若干あるという程度です。これ以上の高速化を狙うにはPHPとMySQLの処理についてもっと根本的な対処が必要なようです。

次回はWordpressのキャッシュプラグインを導入して高速化を狙ってみます。