読者です 読者をやめる 読者になる 読者になる

lighttpd で X-Reproxy-URL ヘッダを使えるようにするモジュール mod_reproxy を書いた

ウェブアプリケーションにおいて、認証がかかっている画像や大きなファイルを配信する場合には、Perlbal 等でサポートされている X-Reproxy-URL ヘッダが有効なことが知られていて、その理由としては、

  • (メモリを大食いする) アプリケーションサーバのプロセスを転送終了まで占有しない
  • HTTP ベースの分散ファイルシステムとリバースプロキシが直接交信するので、ネットワーク負荷が低い

といった点が挙げられます。「でも、Apache は X-Reproxy-URL ヘッダをサポートしてないんだよねー」という話が、先日の YAPC::Asia 2009 においても話題になっていました[要出典]。回避策としては、ワンタイムURLのような手法もあるのですが、セキュリティな懸念もあります。

何とかしたいと思っていたのですが、lighttpd 1.4.x 系では fastcgiproxy などで利用する subrequest フックが1コネクションにつき一つのプラグインでしか使用することができません。 ですので、昔のエントリで紹介したように mod_fastcgi に対するパッチのような形でしか実現不可能かと思っていました。

しかし、kazuho さんが Apache 用のモジュールを書かれているのをみて、このままでは現状よくつかわれている httpd において X-Reproxy-URL をサポートしないのは lighttpd だけになってしまうと思い、もう一度考えてみました。

結論としては、あっさりできました。やる気になってみる物です。Github に置いてあります。

http://github.com/typester/mod_reproxy

使い方は簡単。mod_reproxy.c を lighttpd の src ディレクトリにいれ、src/Makefile.am に以下の行を付け加えます。

lib_LTLIBRARIES += mod_reproxy.la
mod_reproxy_la_SOURCES = mod_reproxy.c
mod_reproxy_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_reproxy_la_LIBADD = $(common_libadd)

その後、

./autogen.sh
./configure ...
make && make install

で、mod_reproxy が付属した lighttpd がインストールされます。

その後、lighttpd の設定ファイルに

reproxy.enable = "enable"

と追記すれば、その追記した範囲において、X-Reproxy-URL ヘッダによる内部リダイレクトが有効になります。基本的に subrequest を使用するすべてのモジュール(mod_proxy, mod_cgi, mod_fastcgi, mod_scgi)でこの機能が有効になります。

それだけです。特に説明することもないのですが、状況によっては便利に使えるかと思います。

参考: Kazuho@Cybozu Labs: Apache で X-Reproxy-URL ヘッダを使えるようにするモジュール mod_reproxy を書いた