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 パワーを使わずに、とてもエコだと思われます。
ただし、子サイトが増えるたびに追記してあげないとなので、注意が必要です。
ピンバック: WPマルチサイト化、外部ブログインポートするメモ | ieha
ピンバック: WPサイトをマルチサイト化して、外部ブログをインポートする | ieha
Googleからお邪魔しました。私もマルチサイトを運営しているのですが、後から考えると構成上マルチにする必要がなかったかなぁと反省しております。
マルチサイトの高速化は素晴らしいアイデアだと思います。ちなみに教えていただきたいのですが、Apacheでサブドメイン方式で無い場合、どのように
記述すればよいのでしょうか?
一見さんで申し訳ないのですが、もし宜しければ教えて下さい。
teppeikawaguchi さん、はじめまして。
こんな感じすかね?
※未検証です。