最近 WordBench が、当サイトと同じめ組のVPSに引っ越して来ました。
そんな縁もあって WordBench.org のサーバのチューニングを手伝ったのでメモ。
今回、行ったチューニングは Apache, PHP, MySQL についてだけで、WordPress のプラグインを用いる ( WP Super Cache や object cache など ) チューニングは行っていません。
WP Super Cache とか使わなくても、サーバー側の設定をつめてやるだけで、子サイトを複数持った WordBench のようなサイトでも、十分に良いパフォーマンスが得られますよっていうお話です。
大まかな項目は、こんな感じ。
- PHP の設定 – PHP アクセラレータ eAccelerator の導入
- Apache の設定 – mod_deflate, mod_expires の有効化
- MySQL の設定 – クエリキャッシュ, ソートバッファ等の設定
PHP の設定
PHPスクリプトを解析した結果を中間コードの状態で共有メモリ上にキャッシュする eAccelerator を導入しました。
WordPress のような多数の PHP スクリプトをインクルードするアプリでは、特に威力を発揮します。
PHP5 を使用している場合は、PHP アクセラレータとしては APC か eAccelerator の二択になります。
PECL でインストールできる APC の方がお手軽なんですが、今回は eAccelerator を使用しました。
ただし、インストールは PECL で一発って訳にはいかないので敷居は高いかもです。
インストール方法は、以前のエントリでさらっと触れてるので、そちらを参照してください。
さくらVPSに lighttpd + PHP 5.3 + MySQL 5.1 をインストール : dogmap.jp
WordBench サイトでは無いですが、実験環境に WordPress のサイトを準備して Apachebench で ab -n 100 -c 10 して検証した結果はこんな感じです。
/ | Time taken for tests | Complete requests | Failed requests | Requests per second | Time per request |
---|---|---|---|---|---|
Apache アクセラレータ無し | 403.793 sec | 100 | 76 | 0.25 [#/sec] | 4037.927 [ms] |
Apache + APC | 20.997 sec | 100 | 2 | 4.76 [#/sec] | 209.969 [ms] |
Apache + eAccelerator | 20.757 sec | 100 | 0 | 4.82 [#/sec] | 207.566 [ms] |
lightppd アクセラレータ無し | 27.168 sec | 100 | 0 | 3.68 [#/sec] | 271.678 [ms] |
lightppd + APC | 18.326 sec | 100 | 3 | 5.46 [#/sec] | 183.258 [ms] |
lightppd + eAccelerator | 19.040 sec | 100 | 0 | 5.25 [#/sec] | 190.396 [ms] |
※すべて同じサーバ上で実験しています。
アクセラレータ無しと比べると圧倒的なパフォーマンスをたたき出してますね。
Apache の設定
WordBench サーバを収容しているデータセンターはサンノゼにあるため通信量を抑える必要があります。
というわけで /etc/httpd/conf.d/ に以下のような内容の設定ファイルを追加し mod_deflate と mod_expires を設定しました。
AddType image/x-icon .ico <IfModule mod_deflate.c> SetOutputFilter DEFLATE BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary SetEnvIfNoCase Request_URI _\.utxt$ no-gzip #DeflateCompressionLevel 4 AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/atom_xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php </IfModule> <ifModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 seconds" ExpiresByType text/html "access plus 1 seconds" ExpiresByType image/gif "access plus 2592000 seconds" ExpiresByType image/jpeg "access plus 2592000 seconds" ExpiresByType image/png "access plus 2592000 seconds" ExpiresByType image/x-icon "access plus 2592000 seconds" ExpiresByType text/css "access plus 604800 seconds" ExpiresByType text/javascript "access plus 216000 seconds" ExpiresByType application/x-javascript "access plus 216000 seconds" ExpiresByType application/x-shockwave-flash "access plus 216000 seconds" </ifModule> FileETag none
Apache の設定については、他には特殊な設定はほとんど行っていません。
運用しながら詰めていく必要がありますね。
MySQL の設定
基本的に MySQL サーバは WordPress でしか使用しない前提で InnoDB を無効にしました。
InnoDB を全く使用していない環境でも InnoDB プロセスが立ち上がると、かなりメモリを圧迫してしまうためです。
メモリが潤沢にあるとはいえない VPS 環境で WordPress を動作させるなら、/etc/my.cnf に skip-innodb
オプションを追加して無効にしておいたほうが良いでしょう。
後は、空メモリと相談してクエリキャッシュやらソートバッファやらを追加しました。
これも運用しながら、設定値を詰めていく必要があります。
現在の設定値は、こんな感じです。
[mysqld] default-character-set=utf8 skip-innodb max_connections=30 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock bind-address=127.0.0.1 old_passwords=1 symbolic-links=0 query_cache_size=96M query_cache_limit=1M query_cache_min_res_unit=4k query_cache_type=1 tmp_table_size=128M max_heap_table_size=128M table_cache=128 max_allowed_packet=1M sort_buffer=1M read_buffer_size=1M read_rnd_buffer_size=1M join_buffer_size=1M key_buffer_size=32M long-query-time=2 slow_query_log=1 slow_query_log_file=/var/log/mysqld-slow.log
query_cache_size, tmp_table_size は、サーバの搭載メモリ数から考えると、かなり多めに取ってあります。
まとめ
最終的にこの状態で、全部で780MB利用できるメモリのうち、空きは230MBほど確保してあります。
子サイトが大量にあるマルチサイトとしては妥当なところでは無いでしょうか。
Web サーバとして Apache では無く、軽量 Web サーバである lighttpd や nginx を採用すれば、さらに軽く動作させることができるでしょう。
最近セットアップを手伝ったカイさんのサイトは、さくらの VPS でメモリがさらにプア(512MB) なため lighttpd を採用させてもらいました。
実際 nginx なんかは WordPress.com でも採用されていて WordPress とも相性が良いと思われます。
ただ、マルチサイト運用時の nginx や lighttpd の資料が中々出てこなかったため、今回は見送らせてもらいました。
この辺の資料を Automattic さんが出してくれると嬉しいなぁとか思ったり思わなかったり。
root 権限がもらえない共有レンタルサーバではできなかった種々のチューニングを施すことができる VPS は楽しいですね。
ただし、各種セキュリティ設定やソフトウエアのアップデートは、共有レンタルサーバのようにホスティング会社に丸投げって訳にはいきません。
ほっておくとセキュリティホール突かれて乗っ取られる危険もあります。
VPS で運営するのであれば、適切なセキュリティ設定と日々のログ監視を行うようお願いします。
ピンバック: 最近WordPressの管理画面が重い » murmur
ピンバック: Tweets that mention WordBench.org のサーバをチューニング : dogmap.jp -- Topsy.com