ちょっと前に連載状態で紹介していた「さくらのVPS」についても実はこの引越しの一環で、自宅で動かしていたものをVPS環境に移すことで、自宅環境で楽をしようという目的がありました。事実、引越し先のインターネットはADSL環境となるので、遅延や帯域的にも引越し前にくらべてかなり不利になってしまいます。
ということで、自宅で運営していた Web コンテンツのうち、Blog ( 今書いているこの Blog は Blogger ですが、実験的なことができる環境も欲しいですよね ) とウェブアルバムについて VPS 環境に移しました。といってもただ単に移行するのでは芸がありませんし、どうせなら旬のものにチャレンジしたいということで、「さくらのVPS + Ubuntu 10.10 Server + lighttpd + MySQL + Wordpress 」というちょっとトンがった環境を作りました。少し前に「LAMP ( Linux + Apache + MySQL + PHP )」なんて言葉がその筋でちょっとだけ流行ったことがありましたが、そんなノリでいけば「LLMP ( Linux + Lighttpd + MySQL + PHP )」ということでしょうか。
とはいっても、Ubuntu のパッケージ体系ではこの組み合わせも想定の範囲内で apt-get だけでほぼすべてのソフトウェアが揃ってしまいます。この柔軟さは兄貴分にあたる Debian 譲りの特徴といえるでしょう。インストールについては都度必要なパッケージをインストール、データベースのセットアップ等必要な事項をこなしていく格好となります。ただ今回は Web サーバに Lighttpd を使ったので、Apache と Lighttpd の相違点で問題となる箇所を修正する必要があります。
特に問題となるのは Apache の mod_rewrite の設定項目で、Lighttpd では Apache 向けの設定をそのまま使うことはできませんし、最新の WordPress のマルチサイト機能を使う場合にはこの設定が必須となるので、ここを乗り越える必要があります。今回は「サブディレクトリ」でのマルチサイト構築となりましたが、WordPress の管理ページでは「ツール」→「ネットワーク」の部分で、
RewriteEngine Onと設定するよう指示がなされます。Lighttpd 的には、URL書き換えを行うmod_rewriteを使い
RewriteBase /
RewriteRule ^index\.php$ - [L]
# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
といったように書いていくのがセオリーなのですが、%{REQUEST_FILENAME} の部分は ModRewrite ではどうも表現できません。ここは随分悩んだところでして、いろんなサイトを調べて、mod_magnetを使い lua で rewrite ルールを記述する必要があることがわかりました。Lighttpd の設定ファイルに
url.rewrite-once = (
"regex1" => "relative-uri1",
"regex2" => "relative-uri2"
)
server.modules += ( "mod_magnet" )と記述し、下記のような wpmu.lua スクリプトを書きます。
$HTTP["host"] =~ "^some\.your\.domain" {
magnet.attract-physical-path-to = ( "/some/path/to/wpmu.lua" )
}
if (not lighty.stat(lighty.env["physical.path"])) thenこれで前掲の .htaccess での mod_rewrite 機能が実装できるかと思います。
if (string.match(lighty.env["uri.path"], "^(/?[^/]*/)files/$")) then
lighty.env["physical.rel-path"] = "index.php"
else
n, a = string.match(lighty.env["uri.path"], "^(/?[^/]*/)files/(.+)")
if a then
lighty.env["physical.rel-path"] = "wp-includes/ms-files.php"
lighty.env["uri.query"] = "file=" .. a
else
n, a = string.match(lighty.env["uri.path"], "^(/?[^/]*/)(wp-.*)")
if a then
lighty.env["physical.rel-path"] = a;
else
n, a = string.match(lighty.env["uri.path"], "^(/?[^/]*/)(.*\.php)$")
if a then
lighty.env["physical.rel-path"] = a
else
lighty.env["physical.rel-path"] = "index.php"
end
end
end
end
lighty.env["physical.path"] = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]
end
ひととおり試してうまくいくようになったことが確認できたら、さらに速度を稼ぐためにこの lua スクリプトをプレコンパイルしておきます。
% luac -o wpmu.luac wpmu.luaまた、設定ファイルの magnet.attract-physical-path-to についても
magnet.attract-physical-path-to = ( "/some/path/to/wpmu.luac" )と書きなおした上で Lighttpd を再起動すれば完了です。
余談ですが、この wpmu.lua、ファイル名や Google 検索でご察しのとおり WordPress MU 向けのファイルとして英語圏で広く共有されているものですが、 WordPress 3 になってメディアライブラリへアップロードされたファイルへアクセスするための php スクリプトが wp-content/blogs.php から wp-includes/ms-files.php に変更になりましたので、この部分を確認しておかないとメディアライブラリにアップロードしたものが利用できないということが起きるので、注意が必要です。