Lighttpd + mod_proxy で Catalystに飛ばす時
何も考えずに
$HTTP["host"] == "backend.example.com" { proxy.server = ( "" => (("host" => "127.0.0.1", "port" => 3000))) }
などとしてしまうと、$c->uri_forが http://backend.example.com:3000/ になってしまって都合が悪い。、大抵バックエンドには直接リクエストは送れないからね。
で、こんな時はCatalyst側でusing_frontend_proxy を 1(@see Catalyst::Engine::CGI)にして、X-Forwarded-Hostがbackend.example.comになるようにすれば良い。
ApacheやZeusのmod_proxyは自動的にX-Forwarded-Hostを付けてくれるんだけど、Lighttpd(v1.4.15 あ…もしかしてちょっと古い?)のmod_proxyは自動でやってくれないので、
setenv.add-request-header = ("X-Forwarded-Host" => "ホスト名")
を明示的に書かないとダメ。(@see [Catalyst] Catalyst::Engine::CGI::prepare_path port)
なのでCatalystバックエンドにmod_proxyで飛ばす場合は、こうする。
$HTTP["host"] == "backend.example.com" { setenv.add-request-header = ("X-Forwarded-Host" => "backend.example.com") proxy.server = ( "" => (("host" => "127.0.0.1", "port" => 3000))) }