FastCGI with mod_fastcgi

mod_fcgidとmod_fastcgiは別物という事実にショックを受けつつ、気を取り直してmod_fastcgiをインストールしてみる。

環境

インストール

既にyumからapacheをinstallしているので、DSOでインストールする。
ちなみにDSOはDynamic Shared Objectの略で、実行時にLoadModuleディレクティブで読み込めるApacheモジュールのこと。そしてapxsはAPache eXtenSion toolのことである。

wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
tar zxfv mod_fastcgi-2.4.6.tar.gz
cd mod_fastcgi-2.4.6


apache 1.3なら以下でOKらしいが、apache2だとうまくいかない...

# for apache 1.3...
apxs -o mod_fastcgi.so -c *.c
apxs -i -a -n fastcgi mod_fastcgi.so



INSTALL.AP2を見ると、以下のように書かれているので、これに従う。

    $ cd <mod_fastcgi_dir>
    $ cp Makefile.AP2 Makefile
    $ make
    $ make install

ただし、top_dirを自分のinstallディレクトリに合わせる必要あるので、下記の通り書き直した。

#top_dir      = /usr/local/apache2
top_dir      = /usr/lib/httpd


/etc/httpd/conf/httpd.confを確認する。無事インストールされている模様。

LoadModule fastcgi_module     /usr/lib/httpd/modules/mod_fastcgi.so

設定

まずは単純なfastcgiスクリプトとして動かそう、ということで/etc/httpd/conf.d/fastcgi.confに以下を記述してapache再起動する。なお、kotaro:kotaro(user:group)でhttpdが動作してる前提。

ScriptAlias /fcgi/ /home/kotaro/fcgi/

fcgiスクリプト

以下をScriptAlias設定した、ディレクトリ/home/kotaro/fcgiにhello.fcgiというファイル名で置く。実行権限はちゃんと付けておく。

#!/usr/bin/perl
use CGI::Fast;

while (my $q = CGI::Fast->new) {
    print("Content-Type: text/plain\n\n");
    foreach $var (sort(keys(%ENV))) {
        $val = $ENV{$var};
        $val =~ s|\n|\\n|g;
        $val =~ s|"|\\"|g;
        print "${var}=\"${val}\"\n";
    }
}

http://localhost/fcgi/hello.fcgi
で動いた!!!

ただし、これだと単なるCGIスクリプトと何も変わらない。プロセス常駐してこそFastCGIの意味があるのだが、方法はstatic, dynamic, externalの3つがある。まずはstaticからトライ。

static

/etc/httpd/conf.d/fastcgi.confを以下に設定

Alias  /fcgi/  /home/kotaro/fcgi/
FastCgiServer /home/kotaro/fcgi/hello.fcgi     -processes 5

これだと動かないので、/var/log/httpdのpermission変更する。

chmod o+x /var/log/httpd


確認すると...

[root@mdev1 ~]# ps aux | grep fcgi
kotaro    1758  0.0  0.1   9976  1896 ?        S    19:33   0:00 /usr/sbin/fcgi-
kotaro    1759  0.0  0.3   5004  3148 ?        S    19:33   0:00 /usr/bin/perl /home/kotaro/fcgi/hello.fcgi
kotaro    1769  0.0  0.2   4812  2852 ?        S    19:33   0:00 /usr/bin/perl /home/kotaro/fcgi/hello.fcgi
kotaro    1770  0.0  0.2   4812  2820 ?        S    19:33   0:00 /usr/bin/perl /home/kotaro/fcgi/hello.fcgi
kotaro    1771  0.0  0.2   4812  2812 ?        S    19:33   0:00 /usr/bin/perl /home/kotaro/fcgi/hello.fcgi
kotaro    1772  0.0  0.2   4812  2816 ?        S    19:33   0:00 /usr/bin/perl /home/kotaro/fcgi/hello.fcgi

ちゃんとfcgiのプロセスが動いてますね〜。ふぅ。

まとめ

  • 既にApacheがインストールされていても、後からmod_fastcgiを組み込むことが可能
  • ScriptAliasを設定すれば、指定したディレクトリ下のファイルをCGIとして動かせる
  • FastCGIには3通り(static,dynamic,external)の動かし方があるが、staticが一番簡単(そう)
  • fastcgiのrunディレクトリ(今回は/var/log/httpd/fastcgi)のパーミッションは注意
  • 最初のコンパイルが面倒なだけで、理解してれば作業量はそれほど多くない

ということでFastCGI怖くない!