天然パーマです。

複数の Catalyst アプリ を複数の apache でサーブさせる .conf

実践投入前の自分のメモもかねてのエントリー。 以前、複数の Catalyst(等) アプリの運用について「lighttpd いい」と書きましたが、 やっぱり apache+mod_perl の運用もありかなと思いました。 apache+mod_perl の場合、 プロセス管理が lighttp と比べてやりやすい&楽というのが理由です。 複数のアプリをサーブしたい場合でも、すごくシンプルに設定を記述できる ってのが lighttpd の利点のひとつですが、 apache も工夫をすれば、そこまで煩雑にならずに複数アプリを起動することができそうです。

方針としては、アプリごとに conf を書いて、ポート別に apache を起動、 フロントの 80番の apache がリバースプロキシ及び静的コンテンツ向けサーバになる、 というものです。 httpd のポートがたくさんできちゃうのが多少気持ち悪い感じしますが、 番号の管理だけちゃんとしてれば、まぁいいかなぁと思います。

一番最後に、運用も視野に入れた必要最小限の conf ファイルのサンプルを貼付けておきます。 myapp_httpd.conf を使う場合、

 $ sudo apache2ctl -f myapp_httpd.conf

としてアプリ別に apache を起動しています。 テストマシンで試験してる段階ではこれで問題はないようです。 以下の例、myapp_httpd.conf の Global Settings に当たる部分は、 アプリケーション間で共通に使うことができるので、 別ファイルにして Include したほうが管理しやすくなりますね。 では conf ファイル。

myapp_httpd.conf

 # Global Settings
 
User www-data
Group www-data
 
Timeout 300
KeepAlive Off
HostnameLookups Off
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/apache2/access.log combined
 
LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
 
# Local Settings
 
Listen 8001
PidFile /var/run/apache2/myapp.pid
 
StartServers 1
MinSpareServers 1
MaxSpareServers 3
MaxClients 10
 
ErrorLog /var/log/apache2/error_myapp.log
CustomLog /var/log/apache2/access_myapp.log combined
 
DocumentRoot /home/www/myapp/root
 
PerlSwitches -I/home/www/myapp/lib
PerlSwitches -I/home/www/myapp/extlib
 
PerlRequire /home/www/myapp/startup.pl
SetHandler perl-script
PerlHandler MyApp

次に front の apache の設定。VirtualHost 前提で、静的コンテンツに関しては Expires ヘッダを付加しています。

 <VirtualHost *:80>
        ServerName myqpp
        DocumentRoot /home/www/myapp/root
        RewriteEngine On
        RewriteRule ^/(static/|favicon.ico) - [L]
        RewriteRule ^/(.*)$ http://localhost:8001/$1 [P,L]
        ExpiresActive On
        <FilesMatch "\.(jpg|gif|png|ico|css|js)$">
            ExpiresDefault "access plus 365 days"
        </FilesMatch>
</VirtualHost>

lighttpd と比べながら、実際に運用へ適応させようかと思っています。 何かおかしなところがあったらツッコミくださーい。