Catalyst + Apache + fastcgi (daemontools)

Catalystを使うときは大概mod_perlで動かしてたんだけど
今回はちょっとfastcgiを使ってみた。

インストール環境

Catalystインストール

Catalyst本体

sudo cpan Catalyst::Runtime
sudo cpan Catalyst::Devel
sudo cpan Catalyst::View::TT

catalyst.pl MyApp

fastcgiインストール

ソースをもってきてインストール

$ wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
$ tar zxf mod_fastcgi-2.4.6.tar.gz 

インストールは「INSTALL.AP2」に載っている通りです。

$ cd mod_fastcgi-2.4.6
$ cp -p Makefile.AP2 Makefile
$ make
$ sudo make install

※apacheのインストディレクトリが/usr/local/apache2以外の場合は
Makefileの

  top_dir      = /usr/local/apache2

を適宜変更。

apacheの設定

apache2.2系はconf/extra配下に各設定ファイルを作ってhttpd.confでインクルードしてるので
Catalystの設定はhttpd-catalyst.confとか作ってやるのが個人的には好きです。

$ pwd
/usr/local/apache2/conf/extra
$ vi httpd-catalyst.conf

設定内容はこんな感じ。

<IfModule mod_fastcgi.c>
    FastCgiExternalServer /tmp/foo.fcgi -socket /tmp/bar.socket -idle-timeout 120
</IfModule>

<VirtualHost *:80>
    ServerName hoge-baz.net
    RewriteEngine on
    RewriteRule ^/(.*) /tmp/foo.fcgi/$1 [L]
    <Files myapp_fastcgi.pl>
        SetHandler fastcgi-script
    </Files>
</VirtualHost>

これでapacheの設定は終わり

Catalystをfastcgiで起動

Catalyst側はMyAppのscript配下にあるmyapp_fastcgi.plを実行してやる。

$ cd MyApp
$ ./script/myapp_fastcgi.pl -n 3 -l '/tmp/bar.socket'

これでソケットを通してapacheとcatalystが連携できました。

daemontoolsを使ってfastcgiを管理する

fastcgiはdaemontoolsを使ってプロセス監視をすると便利です。
daemontoolsそのものは省略。
runファイルはこんな感じ。

#!/bin/sh
exec 2>&1
exec env - \
PATH='/bin:/usr/bin:/usr/local/bin:/usr/local/MyApp/script' \
DBIC_TRACE=1 \
CATALYST_DEBUG=1 \
DBIC_NO_WARN_BAD_PERL=1 \
setuidgid hoge \
myapp_fastcgi.pl -n 3 -l '/tmp/bar.socket'

こうやっとくと例えばプログラムを更新した際は
daemontoolsのコマンド使って

svc -t /service/myapp

ってやればfastcgiが再起動できる