MODXを動かしたい on FreeBSD その3


作成日:2010/9/25
まずはこちらのサイトを見て欲しい。

Friendly URLs on lighttpd

lighttpdでMODxのフレンドリーURLを使う時の設定が載ってます。基本的に「lighttpdに搭載されているmod_rewriteを使えばそれなりに制御できるけど、mod_magnet(lua)を使えばもっといいですよ。」と書かれています(多分)。実はこのページは少し古くmod_rewriteでもrewrite-if-not-fileという設定がlighttpdのどこかのバージョンで実装され、よりapacheのmod_rewriteに近い設定ができるようになっています。
ただ、RTX1200にも実装されているlua自体ちょっと使って見たいのと、どうせ使うならlighttpdにも組み込んでみようというわけで、実際にmod_magnet(lua)を設定してみました。

環境は前回と同じ共用サーバのFreeBSDです。root権限はないためローカルに全部インストールします。
luaのインストール
落としてきたもの。

http://www.lua.org/ftp/lua-5.1.4.tar.gz
http://www.lua.org/ftp/patch-lua-5.1.4-2

今リリースされている5.1.4にはパッチが出ていたので、それを当てた後にインストール。
% tar lua-5.1.4.tar.gz % cd lua-5.1.4/src % patch < ../../patch-lua-5.1.4-2 % cd ../ % make freebsd % make freebsd install INSTALL_TOP=/home/hoge/root % rehash
インストール完了。
lighttpdの再インストール
ついでなので新しいlighttpdをゲット。

http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.28.tar.gz

--with-luaを付けてconfigure。
% tar zxvf lighttpd-1.4.28.tar.gz % cd lighttpd-1.4.28 % ./configure --without-webdav-props --without-webdav-locks --without-ldap --without-bzip2 --without-gdbm --with-lua --without-memcache --disable-ipv6 --prefix=/home/hoge/root …略… checking for LUA... no configure: error: Package requirements (lua-5.1 >= 5.1) were not met: gnome-config: not found No package 'lua-5.1' found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LUA_CFLAGS and LUA_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. %
luaのところでエラーになる。LUA_CFLAGSとLUA_LIBSを設定すれば良さそう。と言うわけで設定。
setenv LUA_CFLAGS "-I/home/hoge/root/include/" setenv LUA_LIBS "-llua" ※bashの時はexportに置き換えよう。
ちなみにここの設定が色々悪くて色々エラーを出してしまった。間違った設定は書かないが、以下実際に叩きだしたエラー。
makeでエラー。 % make /usr/local/bin/bash ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -DHAVE_VERSION_H -DLIBRARY_DIR="\"/home/hoge/root/lib\"" -DSBIN_DIR="\"/home/hoge/root/sbin\"" -I. -I.. -D_REENTRANT -D__EXTENSIONS__ -I/home/hoge/root/include -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGE_FILES /home/hoge/root/include/ -g -O2 -Wall -W -Wshadow -pedantic -std=gnu99 -MT mod_magnet_la-mod_magnet.lo -MD -MP -MF .deps/mod_magnet_la-mod_magnet.Tpo -c -o mod_magnet_la-mod_magnet.lo `test -f 'mod_magnet.c' || echo './'`mod_magnet.c libtool: compile: gcc -DHAVE_CONFIG_H -DHAVE_VERSION_H -DLIBRARY_DIR=\"/home/hoge/root/lib\" -DSBIN_DIR=\"/home/hoge/root/sbin\" -I. -I.. -D_REENTRANT -D__EXTENSIONS__ -I/home/hoge/root/include -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGE_FILES /home/hoge/root/include/ -g -O2 -Wall -W -Wshadow -pedantic -std=gnu99 -MT mod_magnet_la-mod_magnet.lo -MD -MP -MF .deps/mod_magnet_la-mod_magnet.Tpo -c mod_magnet.c -fPIC -DPIC -o .libs/mod_magnet_la-mod_magnet.o gcc: /home/hoge/root/include/: linker input file unused because linking not done cc1: /home/hoge/root/include/: No such file or directory make[3]: *** [mod_magnet_la-mod_magnet.lo] Error 1 make[3]: Leaving directory `/usr/home/hoge/src/lighttpd/lighttpd-1.4.28/src' make[2]: *** [all] Error 2 make[2]: Leaving directory `/usr/home/hoge/src/lighttpd/lighttpd-1.4.28/src' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/usr/home/hoge/src/lighttpd/lighttpd-1.4.28' make: *** [all] Error 2
lighttpd起動するときにエラー。 % ~/etc/rc.d/lighttpd.sh start 2010-09-25 12:29:37: (plugin.c.169) dlopen() failed for: /home/hoge/root/lib/mod_magnet.so /home/hoge/root/lib/mod_magnet.so: Undefined symbol "lua_insert"

と、話を戻してLUA_CFLAGSとLUA_LIBSを設定したのでもういっかいconfigureから。
% ./configure --without-webdav-props --without-webdav-locks --without-ldap --without-bzip2 --without-gdbm --with-lua --without-memcache --disable-ipv6 --prefix=/home/hoge/root % make % make install % ~/etc/rc.d/lighttpd.sh restart ※再インストールしたのでとりあえずlighttpd再起動。
lighttpdの設定ファイルの編集。mod_magnetを有効にする。
server.modules = ( "mod_rewrite", …略… "mod_magnet", #←これを追加 …略… "mod_accesslog" )
rewrite-once(もしくはrewrite-if-not-file)を設定している部分をコメントアウトして、次の設定を追加。
$HTTP["url"] !~ "/(?:manager)" { magnet.attract-physical-path-to = ( "/usr/home/hoge/etc/modx_rewrite.lua" )
次に実際にURLを書きかえるluaファイルの作成。ファイルパスは「/usr/home/hoge/etc/modx_rewrite.lua」
attr = lighty.stat(lighty.env["physical.path"]) if (not attr) then path = "/index.php" uri = lighty.env["request.uri"] lighty.env["uri.query"] = "q=" .. uri lighty.env["uri.path"] = path lighty.env["request.uri"] = path .. "?" .. lighty.env["uri.query"] lighty.env["physical.rel-path"] = path lighty.env["physical.path"] = lighty.env["physical.doc-root"] .. string.sub(lighty.env["physical.rel-path"], 2) end
これでもう一回lighttpdを再起動すれば無事にluaを使ってURL変換がおこなわれる。
luaのコンパイル
luaは中間言語にコンパイルしてlua実行速度の向上を行う事ができます(lispでいうバイトコンパイルした.elcファイルみたいなもの?)。
というわけでさっき作った「modx_rewrite.lua」をコンパイル。
% cd /usr/home/hoge/etc/ % luac -o modx_rewrite.luac modx_rewrite.lua
これで「modx_rewrite.luac」というファイルができる。次にlighttpdの設定ファイルも修正。
$HTTP["url"] !~ "/(?:manager)" { magnet.attract-physical-path-to = ( "/usr/home/hoge/etc/modx_rewrite.luac" ) #←拡張子がluacに。
これでlighttpdを再起動して無事に動いていればOKです。
ちなみにコンパイルした後のluaの拡張子ってluacでいいのかな。適当に付けちゃってるけど。
次のステップ
luaを使う事でapacheのmod_rewriteを手に入れたlighttpd。次に考えてるのはMODx Revoでマルチサイトを実現するときにこれを使ってうまい事色々できないかなぁーと考えています。とりあえず考えているだけなので実際にできるかもわからないけどネ。
そのうちやってみる予定…。