仕事の都合上、FastCGI のお勉強。
うちの会社では、負荷のかかる CGI は mod_perl で開発するのが標準なのだが、他のところで開発したシステムの後継ぎをすることになり。
それが FastCGI だそうな。
本家。
言語は Perl 限定ではなく、Webサーバも Apache 限定ではない。
が、自分が使うのは Apache + Perl なので、とりあえず mod_fastcgi のモジュールを Apache に組み込む。DSO で。
$ tar xzvf mod_fastcgi-2.4.0.tar.gz
$ cd mod_fastcgi-2.4.0
$ /usr/sbin/apxs -o mod_fastcgi.so -c *.c
# /usr/sbin/apxs -i -a -n fastcgi mod_fastcgi.so
httpd.conf に
LoadModule fastcgi_module modules/mod_fastcgi.so
AddModule mod_fastcgi.c
を書き加えて httpd を restart 。
.htaccess には
AddHandler fastcgi-script fcgi
として、拡張子 .fcgi で FastCGI が起動するようにする。
CGI のほうは以下の調子で。(ドキュメントを読めば書いてあることだが)
#!/usr/bin/perl
use CGI::Fast;
while(my $q = CGI::Fast->new){
# ここに自分の CGI の処理を書く。
}
初回のリクエスト時に mod_fastcgi がプロセスを起動。
以後、起動されたプロセスは無限ループして常駐し、リクエストごとに上記 while の中の処理が実行される。
一旦起動されたプロセスは (exit とか die とかしない限り)
生き続けるので、実行中にスクリプトの中身を書き換えても反映されない。
これはちょっと不便だが、生きているプロセスを kill して殺すと、mod_fastcgi が自動的に再起動してくれる。
同時に起動するプロセス数の管理などは、(httpd.conf でもできるが)
FCGI::ProcManager という Perl モジュールを使うと便利そう。
mod_perl と比べた利点は、httpd とは独立した別プロセスで実行されるので httpd が太らない。
また、実行するプロセス数を管理しやすい。
mod_perl では、スクリプトを実行する httpd と静的ファイルを配信する httpd は同じものなので、
起動するプロセスを絞ろうとして MaxClients を低く設定すると、静的ファイルの配信に影響を及ぼす可能性あり。
(まあ、Apache の前に Squid などで Reverse Proxy を設置してやればいいのだけど)
欠点は……いわゆる CGI として動作させるのであれば、特に欠点はないかも。
もっとも mod_perl は CGI の高速化だけでなく、Apache モジュールを Perl で手軽に書くことができる、という利点 (というかそもそもの mod_perl の目的)
があるわけで、要は適材適所。