Apache ウェブサーバーで FastCGI を利用する
最終更新日: 2013.12.17
- FastCGIとは?
- mod_fcgid
- Perl モジュールのインストール
- httpd-develのインストール
- FastCGIライブラリ(fcgi)のインストール
- mod_fcgidのインストール
- FastCGIの設定
- MTの設定方法(その1)
- MTの設定方法(その2)
- httpdサービスの再起動
- FastCGIの運用
FastCGIとは?
- Movable Type(以下MT)のようなCGIはユーザーからアクセスがあってから、Webサーバー経由で起動します。この起動時に設定ファイルの読み込みや、データベースとの接続、ファイルの読み込み、メモリの確保、モジュールの呼び出しなどおこない、CGIの処理が終了するとこれらのプロセスは自動的に停止します。
- このため、MTなどのサイズが大きなCGIで、コメントや多数ユーザーによる書き込み等、頻繁にアクセスがある場合は、この起動処理が毎回行われることでオーバーヘッドとなりCGIのレスポンスとシステム全体の処理が遅くなってしまいます。
- FastCGIはCGIとして呼び出された際にApacheとは別プロセスとして起動し、処理が終了した後でも一定の期間処理を終了することなく、次のCGIへのアクセスを待ちます。アクセスがあった時に同じプロセスを使い回す事で、起動処理のオーバーヘッドが無くなり、レスポンスが上がります。
- FastCGI自体はPerlだけでなく他の言語(RubyやPHPなど)にも対応しており、中〜大規模のサーバーで広く利用されています。
mod_fcgid
- Apacheで利用出来るFastCGIモジュールは「mod_fastcgi」と「mod_fcgid」があります。一般にmod_fastcgiには長期間運用した場合に無応答や不安定になる事があると言われていました。その後mod_fastcgiよりも安定し速い事を売りとしたmod_fcgidが作られ、現在ではApacheプロジェクト配下でメンテナンスされています。
- 今回はMTインストール済みのRedHat系のLinuxディストリビューション(具体的にはCentOS 5.4)にmod_fcgidをインストールする方法を紹介します。
Perl モジュールのインストール
- FCGIモジュールのインストールをcpanコマンドで行います
# cpan FCGI
- CGI::Fastモジュールのインストールをcpanコマンドで行います
# cpan CGI
CGI::FastはCGIモジュールに含まれています。
httpd-develのインストール
- httpd-develのインストールをyumコマンドで行います
# yum install httpd-devel
FastCGIライブラリ(fcgi)のインストール
- 以下のページからダウンロードを行います。
http://www.fastcgi.com/
- ダウンロード
# wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
- tarballの伸張
# tar zxvf fcgi-2.4.0.tar.gz -C /usr/local/src # cd /usr/local/src/fcgi-2.4.0
- configureの実行
# ./configure
- make, make installの実行
# make # make install
mod_fcgidのインストール
- 以下のページからダウンロードを行います。
http://httpd.apache.org/mod_fcgid/
- ダウンロード
# wget http://ftp.riken.jp/net/apache/httpd/mod_fcgid/mod_fcgid-2.3.5.tar.gz
- tarballの伸張
# tar zxvf mod_fcgid-2.3.5.tar.gz -C /usr/local/src/ # cd /usr/local/src/mod_fcgid-2.3.5/
- DSOとしてインストールするためにconfigure.apxsを実行します。
# ./configure.apxs
- make, make installの実行
# make # make install
FastCGIの設定
- 設定ファイルを新しく作成します。
# vi /etc/httpd/conf.d/fcgid.conf
- 設定ファイル(通常)
<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi SocketPath /tmp/fcgid_sock/ IPCConnectTimeout 20 MaxProcessCount 8 DefaultMaxClassProcessCount 2 TerminationScore 10 SpawnScore 80 IdleTimeout 300 MaxRequestLen 2097152 </IfModule>
mod_fcgid 2.3.6 以降では、MaxRequestLen を指定しない場合は、上限が128KBになります。
- 設定ファイル(make installで正しく設定出来なかった場合)
通常はmake install時に自動的に/etc/httpd/conf/httpd.confにmod_fcgid.soの情報が追記されますが、追記されない場合は下記のように明示的にLoadModule行を指定してください。
LoadModule fcgid_module /usr/lib/httpd/modules/mod_fcgid.so <IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi SocketPath /tmp/fcgid_sock/ IPCConnectTimeout 20 MaxProcessCount 8 DefaultMaxClassProcessCount 2 TerminationScore 10 SpawnScore 80 IdleTimeout 300 MaxRequestLen 2097152 </IfModule>
mod_fcgid 2.3.6 以降では、MaxRequestLen を指定しない場合は、上限が128KBになります。
MTの設定方法(その1) (「その1」「その2」はどちらか片方を実行してください。)
設定をApache設定の変更だけで行う方法
Aacheのhttpd.confを修正するだけで、MT側の設定を一切必要としないという利点があります。
ファイル名の変更、mt-config.cgiの変更も必要がありません。
- 以下の設定をhttpd.confに追加して下さい。
<Directory "/var/www/cgi-bin/mt"> AllowOverride None Options ExecCGI Order allow,deny Allow from all <FilesMatch "^mt(?:-(?:comments|search|ftsearch|tb|cp))?\.cgi$"> SetHandler fcgid-script </FilesMatch> </Directory>
MTの設定方法(その2) (「その1」「その2」はどちらか片方を実行してください。)
設定をMTディレクトリ内だけで行う方法
「MTの設定方法(その1)」と違い、Apacheの設定変更を必要しないという利点があります。
- FastCGIでMTを動かすため、拡張子を"cgi"から"fcgi"に変更します。
# cd /var/www/cgi-bin/mt/ # cp -a mt.cgi mt.fcgi # cp -a mt-comments.cgi mt-comments.fcgi # cp -a mt-tb.cgi mt-tb.fcgi # cp -a mt-search.cgi mt-search.fcgi # cp -a mt-ftsearch.cgi mt-ftsearch.fcgi # cp -a mt-cp.cgi mt-cp.fcgi (Community Solution を利用する場合)
- FastCGIで起動するようにMTの設定ファイル「mt-config.cgi」を修正する必要があります。
# vi /var/www/cgi-bin/mt/mt-config.cgi
- mt-config.cgiの最後に追加してください。
AdminScript mt.fcgi CommentScript mt-comments.fcgi TrackbackScript mt-tb.fcgi SearchScript mt-search.fcgi (もしくは mt-ftsearch.fcgi) ViewScript mt-view.fcgi CommunityScript mt-cp.fcgi (Community Solution を利用する場合)
httpdサービスの再起動
- 設定の変更とモジュールの読み込みを行うためhttpdをリスタートします。
# service httpd restart
FastCGIの運用
- 長期間FastCGIを使ってApacheの運用を行った場合、FastCGI化されたMTが不安定な挙動を起こしたり、無応答になる場合があります。この不具合はmod_fcgidで修正されているとされていますが、完全では無いとの報告も上がっています。
- このような状態になった場合はApacheを再起動して、定期的にFastCGIをリフレッシュさせる事で不具合のあるFastCGIプロセスを終了させる事ができます。同様にダイナミックパブリッシングに利用されているPHPも不安定になる場合があるので、Apacheの定期的な再起動は有用です。
- またプラグインをインストールした後など、MTのシステムに変更を行った場合、MTのディレクトリに入って以下のコマンドを実行し、mt.fcgiのタイムスタンプを更新します。これによりFastCGI側のプロセスがシステムが更新された事を認識しApacheのリスタート無しにMTシステム+FastCGIの更新ができます。
# cd /var/www/cgi-bin/mt/ # touch *.fcgi ./
※URLおよびファイル名は2010年3月23日現在のものとなります。最新版がある場合やダウンロードが出来ない場合は適宜読み替えて下さい。