Apahce2.(0|2) + fastcgi + catalyst

予定では今日明日は OFF のつもりだったんだが、作業が長引き今日は仕事。
Catalyst で組んでいる CMScgi で動かすと遅いので、さてどうしようかと。
mod_perl はデプロイ先がたくさんの VirtualHost が動いている関係で Pass。
Lighty 使うのも同様の理由で Pass。
さらに、mod_proxy 経由で Lighty や mod_perl 噛ませた Apache 別立てするプランもテストの時間が無いので今回は Pass。
となると、事実上、fastcgi 程度しか選択肢がない*1


ところが Web 上にあまり情報が無く、なんやかやで少々てこずったので備忘録*2

  1. FastCGI のインストール
    まず、$ locate special.mk とかして、special.mk の有無を確認しておく。なければ # yum install httpd-devel。
    http://fastcgi.com/ より source を落とし、./configure && make && make install で OK。
  2. mod_fcgid のインストール
    mod_fcgid の source を落とし、Makefile を修正する。
    top_dir = /usr/lib/httpd
  3. /etc/ld.so.conf の修正
    /usr/local/lib を追加し、# ldconfig
  4. # perl -MCPAN -e 'install FCGI;install CGI::Fast' とかしておく
  5. httpd.conf の修正
    下記参照
# cat /etc/httpd/conf.d/fcgid.conf
LoadModule fcgid_module modules/mod_fcgid.so
<IfModule mod_fcgid.c>
    SocketPath /tmp/fcgid_sock/
    AddHandler fcgid-script .fcgi
</IfModule>

httpd.conf はこう。
Virtual Host ディレクティブに書いた。必要な部分のみ抜粋。

Alias /static /PATH_TO_CATALYST_APPDIR/root/static
<Location /static>
    SetHandler default-handler
</Location>

<Directory "/PATH_TO_CATALYST_APPDIR/script">
  Options +ExecCGI
  <Files APPS_fastcgi.pl>
    SetHandler fcgid-script
  </Files>
</Directory>
Alias /PUBLIC_DIR_URI/ /PATH_TO_CATALYST_APPDIR/script/APPS_fastcgi.pl/

/static は、Catalyst の static に Alias を張り、SetHandler で Default-handler を指定すると、fcgid を経由せずにダイレクトに Apache が応答する。つまり、その分のタイムラグが減少できる。
そして Catalyst の App/script/App_fastcgi.pl に対して公開したい URI を Alias 指定すれば OK。
ノーマル CGI より、体感で 400% くらい速度が向上した。

*1:memcached という選択肢は、オーバヘッドで食らってるようなのと、catalyst との相性が不明のためパス

*2:さらに調べたらあった。http://www.yanoryuichi.com/wiki/index.php?Perl-Catalyst