WordPress マルチサイト版の高速化アイデア

WordPress をマルチサイトで使用していると、画像のURLが以下のような感じになると思います。

http://hoge.example.com/files/2011/05/fuga.jpg

しかし、実際にはサーバ上には /files/2011/05/fuga.jpg ってファイルは存在してません。
WordPress が、どうやってこのファイルを処理しているかというと

  1. wp-includes/rewrite.php の WP_Rewrite クラスで wp-includes/ms-files.php?file=2011/05/fuga.jpg に書き換え
  2. 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 パワーを使わずに、とてもエコだと思われます。
ただし、子サイトが増えるたびに追記してあげないとなので、注意が必要です。

WordPress マルチサイト版の高速化アイデア」への4件のフィードバック

  1. ピンバック: WPマルチサイト化、外部ブログインポートするメモ | ieha

  2. ピンバック: WPサイトをマルチサイト化して、外部ブログをインポートする | ieha

  3. teppeikawaguchi

    Googleからお邪魔しました。私もマルチサイトを運営しているのですが、後から考えると構成上マルチにする必要がなかったかなぁと反省しております。
    マルチサイトの高速化は素晴らしいアイデアだと思います。ちなみに教えていただきたいのですが、Apacheでサブドメイン方式で無い場合、どのように
    記述すればよいのでしょうか?
    一見さんで申し訳ないのですが、もし宜しければ教えて下さい。

    返信
    1. をかもと 投稿作成者

      teppeikawaguchi さん、はじめまして。

      こんな感じすかね?

      RewriteEngine On
      RewriteCond %{HTTP_HOST} ^example\.com$
      RewriteRule ^(/hoge/files/.+) %{HTTP_HOST}$1 [C]
      RewriteRule ^example\.com(/hoge/files/.*) /wp-content/blogs.dir/2$1 [L]

      ※未検証です。

      返信

コメントを残す

メールアドレスが公開されることはありません。