仕事の都合上、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 の目的) があるわけで、要は適材適所。