Gauche の CGI スクリプトを lighttpd + FastCGI で動かす手順。自分用の備忘録。
FastCGI は、Web サーバと外部プログラム間のやり取りを規定した一種のプロトコル。外部プログラムは起動しっぱなしになっていて、Web サーバは、その起動しっぱなしのプロセスと必要に応じてやり取りする。したがって、外部プログラムには、起動しっぱなしで Web サーバとおしゃべりできる仕組みが必要で、Web サーバのほうも、そんな外部プログラムとおしゃべりできないといけない。
外部プログラム側で必要となる仕掛けは、Gauche の場合、
Gauche-fastcgi が提供する
with-fastcgi という関数で
cgi-main をくるむだけでいい。Gauche-fastcgi のインストールには FastCGI の開発ツールキットが必要。
Web サーバのほうは、lighttpd を使う場合、
mod_fastcgi を有効にして、しかるべき設定をする。lighttpd の設定ファイルは
/etc/lighttpd/lighttpd.conf なので、まあこれを編集してもいいのだけれど、Debian では
lighty-enable-mod というユーティリティがあるのでこれを使う。具体的には、
/etc/lighttpd/conf-available/ 以下に
nn-name.conf という形式の名前を付けたファイルで設定の断片を用意し(
nn は優先順、
name は名前)、
lighty-enable-mod name を実行する。最初から用意されている
nn-name.conf ファイルもいくつかあって、
10-fastcgi.conf という FastCGI 用のものもあるけれど、きっと Gauche で書いた FastCGI スクリプトには対応していない。だから、代わりに次のような内容の
10-fastcgi.conf を用意する。
server.modules += ( "mod_fastcgi" )
fastcgi.server = (
"sample.fcgi" => ((
"host" => "127.0.0.1",
"port" => 1026
)),
"index.fcgi" => ((
"host" => "127.0.0.1",
"port" => 1027
))
)
sample.fcgi や
index.fcgi が、 Gauche で書いた実行可能なスクリプトのファイル名。この設定は、「クライアントから
sample.fcgi を要求されたら、localhost 上のポート 1026 で動きっぱなしの
sample.fcgi に処理させますよ」などと読む。というわけで、事前に localhost 上のポート 1026 で
sample.fcgi を動きっぱなしにしておく必要がある。そのために使うのは
spawn-fcgi という lighttpd に付属するコマンド。
$ sudo spawn-fcgi -f /var/www/sample.fcgi -p 1026 -u www-data -g www-data
$ sudo spawn-fcgi -f /var/www/index.fcgi -p 1027 -u www-data -g www-data
これで、FastCGI でのおしゃべりをポート 1026 (あるいは 1027)で待ち受けるプロセスが立ち上がる。なお、
sample.fcgi や
index.fcgi に実行権限が付与されてないと(
chmod 755 されてないと)、
spawn-fcgi がエラーになる。また、Gauche のエラーでプロセスが死んでも
spawn-fcgi そのものは成功してしまうので、
spawn-fcgi の実行後に
ps awx | grep gosh して起動しっぱなしのプロセスがあることを確認したほうがいい。
この後、lighttpd を起動する。すでに起動していて再起動する場合は、設定ファイルの再読み込みもしておく。
$ sudo /etc/init.d/lighttpd force-reload
$ sudo /etc/init.d/lighttpd restart
これで準備はおしまい。リロードしまくっても新しい gosh プロセスが毎回起動しなければOK。
なお、この手順は、事前に動きっぱなしにしておいた外部プログラムをIPアドレスとポートで識別する方法。識別に UNIX ドメインソケットを使うこともできる。また、外部プログラムを事前に起動しておかず、初回は lighttpd から起動させることもできる。細かい話は lighttpd の
mod_fastcgi のドキュメントにいろいろと書いてあった。