携帯、iphone,スマフォ用表示のplugin で高速化
携帯などからアクセスされた際に、PC用の表示ではなくて、それぞれに適した(コンパクトな)表示をすれば早くなりそう。
この辺のpluginを使うと、User-Agent によって応答するコンテンツを変更しているということなので、レスポンスのVaryヘッダに User-Agentを足しといたほうがよい。
apacheでは
Header append Vary User-Agent
php をaccelerator で高速化
- APC (Alternative PHP Cache)
- eAccelerator
などで。phpあんましわかんないけど http://en.wikipedia.org/wiki/List_of_PHP_accelerators を見ると、APCがデファクトスタンダードになりつつあって、php 6.0 のcoreに採用される予定らしいので、とりあえずAPC使ってみるなど。
MySQL のチューニング
メモリ関連、クエリキャッシュなど。 あとはテーブルエンジンをMyISAM から InnoDBに変えてみるとか。 MyISAMは更新時のロックがテーブルロックなので、アクセス数が多いと行レベルロックのInnoDBが有利になるかも?
theme で高速化
YSlow などで調べながら。css,js など・クライアントサイトの描画で。
nginx, lighty などの軽量リバースプロキシを置いて高速化
wp ど素人なのであってるかわかんないけど。生成されるhtaccessが
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
ということは、リクエストが来たファイルが存在する場合はphpじゃなくて、静的なcss,js などで応答している。
ということはnginxなどをapacheの前に置いて、静的なファイルについてはnginxで返せば少しは早くなるはず。
あとgzip でコンテンツ圧縮かける。ただし、gzip_vary on にしていると、backend のapache が返してきたvary ヘッダとは別にnginx も"Vary: Accept-Encofing" ヘッダを応答してしまう。
なので backend にproxy するときは gzip_vary off; で。
- nginx.conf
zip on; gzip_vary on; gzip_buffers 4 8k; gzip_min_length 10; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/javascript; gzip_types application/xml; gzip_disable "msie6"; location ~ ".+\.(jpe?g|gif|png|css|ico)$" { ## proxy_pass しないでnginx で応答する } location / { proxy_pass http://backend_apache; gzip_vary off; }
nginx と wp super cache の合わせ技
WP Super Cache pluginを使うとcacheされたhtmlファイルが以下のように生成される。例えば以下のwordpressのURLアクセスすると (パーマリンクを /%year%/%monthnum%/%day%/%post_id%.html で設定。
http://blog.example.com/2011/04/10/100.html
cacheで生成されるファイルは $docroot/wp-content/cache/supercache/blog.example.com/2011/04/10/100.html/index.html
となり、supercacheの仕組みは、cacheがあれば、cacheを返して、なければ動的に生成っていうところをphpがみているので軽くはなるけど一旦phpが絡んでいる。
ということは一度WP super cache でhtmlを生成すれば、それをそのままnginxで返せばもっとはやくなるはず。ということでちょろっと思いついたconfigがこれ。
=> iphone用とか考えてない
location / { gzip_vary off; if ( -f "$document_root/wp-content/cache/supercache/blog.example.com$request_uri/index.html" ) { rewrite ^(.*)$ "/wp-content/cache/supercache/blog.example.com$request_uri/index.html"; break; } if ( $request_filename ~ "\.php" ) { proxy_pass http://apache1; break; } if ( !-f $request_filename ) { proxy_pass http://apache1; break; } }