単一のCatalyst(PSGI) + Nginxで複数のサブドメインを運用してみる。
2012年9月30日
これCatalyst(FCGI)+Apache時代にもやってたんだけど、普通はどんな感じなんだろ。
やっぱサブドメイン毎にCatalystを分けるのかな?
ちなみに、Catalyst(FCGI)+Apache版は -> この辺参照
やりたい事としては、
MyApp::Controller::Milk->index() MyApp::Controller::Coffee->index()
を、それぞれ、
http://milk.example.com/ http://coffee.example.com/
って感じでアクセスしたいんですが。
最初から分ければ、
catalyst.pl Milk catalyst.pl Coffee Milk::Controller::Root->index() Coffee::Controller::Root->index()
って、2つ作って、それぞれnginxにproxy_passを設定すればいいんですが・・。
nginxにapacheで言うところのSetenv的な動きをする設定がわからなかったんですが、
(ちなみにadd_headerは、リクエストヘッダではなく、レスポンスヘッダなので注意w)
NginxHttpHeadersMoreModuleってモジュール入れたらできるようです。
(Nginxのリビルド必須です)
で、簡単にやる方法として、
「X-Forwarded-Host」とかは、普通に
proxy_set_header X-Forwarded-Host milk
で、上書きできるのでこれでいいかなー。どうせ使ってないし。(使ってました。追記参照↓)
Catalystで受け取る時は、
$c->engine->env->{'HTTP_HOST'}; # milk $c->engine->env->{'HTTP_X_FORWARDED_HOST'}; # milk
で取得できます。
今回もMyApp.pmのprepare_actionを弄る事にします。
sub prepare_action { my $c = shift; if ( $c->req->{'_path'} ) { $c->req->{'_path'} = $c->engine->env->{'HTTP_HOST'} . '/' . $c->req->{'_path'}; } else { $c->req->{'_path'} = $c->engine->env->{'HTTP_HOST'}; } $c->dispatcher->prepare_action( $c, @_ ); }
こんなのを__PACKAGE__->setup();の下あたりに追加。
Nginxは上にも書いたけど、
server { listen 80; server_name milk.example.com; location ~ . { proxy_pass http://127.0.0.1:8080; proxy_set_header X-Forwarded-Host milk; break; } }
これで、8080で待っている.psgiに向けてプロキシ。
↑のNginxの設定だけだと静的ファイルまでくるので、適時修正。
(追記)
Catalystの$c->uri_forで、HTTP_HOST使ってるみたいですね。
やっぱNginxHttpHeadersMoreModule使う方が無難か。