FastCGI の利用

  • 投稿日:
  • by

MT3.34 から FastCGI のサポートが向上されました。今回は、サーバーに FastCGI をインストールするところから、実際に動作させるまでを書きます。

まず、FastCGI には 2 種類あります。
mod_fastcgi と mod_fcgid です。今回は、デフォルトのオプションの状態で mod_fastcgi より高速と言われている mod_fcgid を利用することにします。

では、以下のサイトから最新のパッケージをダウンロードします。

■ mod_fcgid 配布サイト

で、適当なディレクトリに置きます。今回は、/usr/local/src/ に置くことにします。

make するときに必要なので httpd-devel を先にインストールし、mod_fcgid.2.2.tgz を展開します。

[root@host ~]# yum -y install httpd-devel
[root@host ~]# cd /usr/local/src/
[root@host src]# tar zxvf mod_fcgid.2.2.tgz
[root@host src]# cd mod_fcgid.2.2/

make する前に Makefile を環境に合わせて編集します。

[root@host mod_fcgid.2.2]# vi Makefile 

top_dir のパスを環境に合わせて変更します。ディストリビューションや、アーキテクチャによっても違ってくるので注意!間違うと make でエラーが起きます。

#top_dir = /usr/local/apache2
top_dir = /usr/lib64/httpd ← これはアーキテクチャが x86_64 の場合。CentOS で i386 の場合は /usr/lib/httpd となる。

あとは、make & make install を実行します。

[root@host mod_fcgid.2.2]# make
[root@host mod_fcgid.2.2]# make install

続いて、httpd.conf の編集です。

[root@host mod_fcgid.2.2]# cd
[root@host ~]# vi /etc/httpd/conf/httpd.conf

httpd.conf に、以下の内容を追加します。
簡単で利用しやすいのは、ファイルの拡張子で制御する方法です。例えば、拡張子が「.fcgi」のファイルのみ FastCGI を有効にするといった方法が一般的かと思われます。
でも、それだとほかのユーザーがいた場合には、やはり別個に制限を設けないと、みんな FastCGI として実行されてしまいます。(CGI で書かれたコードが FastCGI に対応している必要がありますが...)

今回は、/home/user/public_html/cgi-bin/mod_fcgid ディレクトリ以下の CGI ファイルに対してのみ、FastCGI を有効にします。

LoadModule fcgid_module modules/mod_fcgid.so

<IfModule mod_fcgid.c>
    SocketPath /tmp/fcgid_sock/
    IPCCommTimeout 60
    <Directory "/home/user/public_html/cgi-bin/mod_fcgid">
        AllowOverride None
        Options ExecCGI
        Order allow,deny
        Allow from all
    <FilesMatch "^(?:mt|mt-comments|mt-search|mt-tb|mt-view)?\.cgi$">
        AddHandler fcgid-script .cgi
    </FilesMatch>
    </Directory>
</IfModule>

httpd.conf を編集したら保存。

ググってみると SetHandler を使っている例を多く見かけるのですが、自分の場合は Apache の起動時にエラーが発生してしまいました。

[root@host ~]# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: Syntax error on line 1027 of /etc/httpd/conf/httpd.conf:
SetHandler takes one argument, a handler name that overrides any other configured handler
                                                           [失敗]

SetHandler の設定を上書きできないと言われているので、上記の設定のように AddHandler で対処しました。

さらにもうひとつ。
自分は FastCGI を使うファイルを、以下のように限定しています。

<FilesMatch "^(?:mt|mt-comments|mt-search|mt-tb|mt-view)?\.cgi$">

しかし、ググって見て多く見受けられるのは以下の記述でした。

<FilesMatch "^mt(?:-(?:comments|search|tb|view))?\.cgi$">

確かにこちらの方がスマートです。ただ、これはあくまでファイル名がデフォルトの場合にのみ有効な設定です。自分の場合は、今後上記の CGI ファイル名を変更する予定なので、変更後の修正が容易なように、あえてちょっと不格好な記述にしました。

次に、fcgid が実行される場所を作成。

[root@host ~]# mkdir /tmp/fcgid_sock/
[root@host ~]# chmod 777 /tmp/fcgid_sock/

仕上げに、FCGI モジュールをインストールします。これを忘れると動きません!

yum のリポジトリに RPMforge を追加している場合は、以下のコマンドでインストールできます。

[root@host ~]# yum --enablerepo=rpmforge install perl-FCGI

cpan2rpm でインストールする場合は、以下になると思います。(これは試してないです ^^; )

[root@host ~]# cpan2rpm --install FCGI

CPAN でインストールする場合は、以下になります。

[root@host ~]# perl -MCPAN -e shell
cpan> install FCGI
cpan> quit

で、最後に Apache をリスタート。

[root@host ~]# service httpd restart 

以上です。お疲れ様でした!

参考サイト
■ Hosting MT under FastCGI (Japanese)