読者です 読者をやめる 読者になる 読者になる

うまいぼうぶろぐ

linuxとhttpdとperlのメモ

wordpress を高速化させる

wordpress nginx

WP plugin で高速化

  • WP Super Cache でcacheする
  • Script Compressor でcss,js の余分な空白を削除する

など。他にもいっぱいありそう。


携帯、iphone,スマフォ用表示のplugin で高速化

携帯などからアクセスされた際に、PC用の表示ではなくて、それぞれに適した(コンパクトな)表示をすれば早くなりそう。

この辺のpluginを使うと、User-Agent によって応答するコンテンツを変更しているということなので、レスポンスのVaryヘッダに User-Agentを足しといたほうがよい。
apacheでは

Header append Vary User-Agent

php をaccelerator で高速化

などで。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;
  }
}