mod_proxyはいずこ?¶
Zopeのフロントエンドにapacheを配置して、VirtualHostNameを用いてZopeへマッピングする方法はよく使われる方法ですが、今回FreeBSD(5.2.1)サーバーを再構築した際にapacheのバージョンを2.0.50へ上げたところmod_proxyが使えなくなってしまい、かなり苦労しました。
apacheが窓口となる場合、例えば http://www.freia.jp/ というサイトへのアクセスをapacheが受信した際に http://localhost:8080/ へ問い合わせて結果をブラウザへ返すことが出来ます。例えば:
ServerAdmin owner@www.freia.jp
ServerName www.freia.jp
ErrorLog /var/log/httpd/freia-error.log
CustomLog /var/log/httpd/freia-access.log combined
RewriteEngine On
RewriteRule ^/(.*) http://localhost:8080/$1 [P]
と書くと、ブラウザのURL表示は http://www.freia.jp/ のままapacheが内部的にlocalhost:8080へ問い合わせを行ってくれます。ここでポイントとなるのが RewriteRule 行の最後にある [P] です。これはproxy動作のためのフラグで、これを付けずに:
RewriteRule ^/(.*) http://localhost:8080/$1
などと書いてしまうと、ブラウザが直接 http://localhost:8080/ へ問い合わせてしまいますので、ブラウザが稼働しているパソコン自身の8080ポートへ問い合わせが行われます。
このproxyはmod_proxyという外部モジュールで実現されているのですが、FreeBSDのportのデフォルトではmod_proxyが無効になっていました。もしかしたらapache2.0.50標準で無効なのかもしれませんが、調べていません。(セキュリティー上の問題?)
結果的には:
> make -DWITH_PROXY_MODULES="YES"
としてapacheをビルドし直し、無事使用できるようになったのですが、ここにたどり着くために Makefile, Makefile.modules, Makefile.modules.3rd などを読み解いたり、apacheのproxy/rewrite周りのドキュメントを解読したりと、かなりの時間を食ってしまいました。
ちなみに、ZopeのVirtualHostMonsterを組み合わせて以下のように RewriteRule を記述するとZope上の任意のフォルダをそのサイトのルートフォルダとして表示することが出来ます:
RewriteRule ^/(.*) http://localhost:8080/VirtualHostBase/http/www.freia.jp:80/freiaroot/VirtualHostRoot/$1 [P]
上記の例では freiaroot というZope上のパスをwww.freia.jpにアクセスしたときに表示します。同じページをZopeで直接表示するには www.freia.jp:8080/freiaroot/ となります。これを使えば複数のドメインを単一のZopeサーバーで管理することが出来るようになります。
それにしてもmod_proxyがデフォルトで使えないとなると、またZope環境構築の障害が一つ増えてしまうのではないかと心配です。