Mojoliciousをサブディレクトリで運用する
本番環境で複数のアプリケーションをデプロイするときには、サブドメイン運用ができるのであれば、リバースプロキシ + サブドメインでのデプロイをお勧めします。難しいことを考えないでも、サブドメインごとにバーチャルホストを設定してあげれば、アプリケーションの変更がいらないからです。
でもMojoliciousを使えばサブディレクトリで運用することも可能です。リバースプロキシ + サブディレクトリで運用する方法を紹介します。httpサーバーはApacheとします。
まずApacheの設定ファイルです。
<VirtualHost *:80>
ServerName perlcodesample.com
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /app1 http://localhost:3000/app1 keepalive=On
ProxyPassReverse /app1 http://localhost:3000/app1
ProxyPass /app2 http://localhost:3001/app2 keepalive=On
ProxyPassReverse /app2 http://localhost:3001/app2
RequestHeader set X-ProxyPassReverse-UsePrefix "On"
RequestHeader set X-Forwarded-HTTPS "0"
</VirtualHost>
サブディレクトリごとにリバースプロキシの設定をしています。X-ProxyPassReverse-UsePrefixはアプリケーション独自のHTTPヘッダになります。
以下はアプリケーションです。before_dispatchを使って、URLの書き換えを行っています。これはMojoliciousのルーターやurl_forなどのメソッドが正しいURLを認識するために必要です。
use Mojolicious::Lite;
app->hook(before_dispatch => sub {
my $self = shift;
my $use_prefix
= $self->req->headers->header('X-ProxyPassReverse-UsePrefix');
if (defined $use_prefix && lc $use_prefix eq 'on') {
my $prefix = shift @{$self->req->url->path->parts};
$self->req->url->base->path->parse("/$prefix");
}
});
get '/' => 'index';
get '/foo' => 'foo';
app->start;
__DATA__
@@ index.html.ep
URL: <a href="<%= url_for '/foo' %>">Foo</a>
@@ foo.html.ep
Foo
このようにアプリケーションを記述しておけば、サブディレクトリでの運用が可能になります。
Perlゼミ

