WordPress をマルチサイトで使用していると、画像のURLが以下のような感じになると思います。
http://hoge.example.com/files/2011/05/fuga.jpg
しかし、実際にはサーバ上には /files/2011/05/fuga.jpg ってファイルは存在してません。
WordPress が、どうやってこのファイルを処理しているかというと…
- wp-includes/rewrite.php の WP_Rewrite クラスで
wp-includes/ms-files.php?file=2011/05/fuga.jpgに書き換え - wp-includes/ms-files.php で、
/wp-content/blogs.dir/{blog ID}/files/2011/05/fuga.jpgを読み込んで出力
つまり、静的ファイルにアクセスするためにわざわざ WordPress のプロセスを起動してるわけですね。
これでは、画像をいっぱい張ってある場合、非常に重たくなります。
てなわけで、以下のように設定してやれば wp-includes/ms-files.php を経由しないで、直接 Web サーバに応答させることができるのでは無いの?ってな按配です。
Apache .htaccess に書いちゃう例
Web サーバとして Apache を採用していて、子サイトのサイト名が hoge.example.com で、ブログIDが2の場合。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^hoge\.example\.com$
RewriteRule ^(/files/.+) %{HTTP_HOST}$1 [C]
RewriteRule ^hoge\.example\.com(/files/.*) /wp-content/blogs.dir/2$1 [L]
※未検証です、多分ちゃんと動くと思うけど…
nginx を使用している場合の nginx.conf に書いちゃう例
Web サーバとして nginx を採用していて、WordPress のインストールディレクトリが /path.to で、子サイトのサイト名が hoge.example.com、ブログIDが2の場合。
server {
listen 80;
server_name hoge.example.com;
:
location /files {
root /path.to/wp-content/blogs.dir/2;
index index.html;
access_log off;
expires 30d;
break;
}
:
}
これで、静的ファイル出力時に WordPress プロセスを起動しなくても Web サーバが応答してくれますね。
無駄な CPU パワーを使わずに、とてもエコだと思われます。
ただし、子サイトが増えるたびに追記してあげないとなので、注意が必要です。

2011年10月23日 日曜日 2:18 PM



Googleからお邪魔しました。私もマルチサイトを運営しているのですが、後から考えると構成上マルチにする必要がなかったかなぁと反省しております。
マルチサイトの高速化は素晴らしいアイデアだと思います。ちなみに教えていただきたいのですが、Apacheでサブドメイン方式で無い場合、どのように
記述すればよいのでしょうか?
一見さんで申し訳ないのですが、もし宜しければ教えて下さい。
teppeikawaguchi さん、はじめまして。
こんな感じすかね?
※未検証です。
Reader
「WordPress マルチサイト版の高速化アイデア」 http://j.mp/lbk1Hw 少し前の記事ですが。試しにやってみたところ、こうか は ばつぐん だ !
画像リソースのURLリライトをmod_rewriteにやらせる
WordPress マルチサイト版の高速化アイデア : dogmap.jp http://htn.to/hyuqd6
WordPress マルチサイト版の高速化アイデア!!
http://dogmap.jp/2011/05/06/wordpress-マルチサイト版の高速化アイデア/
見てる:
見てる: 『WordPress マルチサイト版の高速化アイデア : dogmap.jp』 http://bit.ly/jaaFqZ
WordPress マルチサイト版の高速化アイデア : dogmap.jp http://htn.to/r3vN5z