FastCGI をインストールして高速化を試みる。インストールができることは確認したが,導入は見送ることにした。
Movable Type の管理画面の動作を軽くしたい。そこで,FastCGI を試すことにした。自宅サーバにインストールする。
環境は,Vine Linux 4.1 (kernel 2.6.16),Apache 2.2.3 である。インストールするのは DSO (Dynamic Shared Object) の mod_fastcgi 2.4.6 (FastCGI)。Movable Type の動作が軽快になることを期待している (MTOS と MT 2.661)。
FastCGI のサイトから最新のソースをダウンロードする。Apache 2 用の現時点での最新版は 2.4.6 となっている (Index of /dist)。
Apache 2 の場合,FastCGI 2.4.2 ではパッチが必要だったが ([FASTCGI] Fastcgi module for Apache 2.2),FastCGI 2.4.6 では不要となった。tarball の中にある INSTALL.AP2 (Apache 2 用のインストール手順) の通りに進める。
最後の make install で,mod_fastcgi.so が /etc/apache2/modules (実際は /usr/lib/apache2/modules) にコピーされる。
FastCGI は,通信用ソケットファイルを動的に生成する。デフォルトでは,/tmp/fcgi に作成されるが,/tmp 以下にファイルを置いておくと消えてしまうことがある (zwiki: FastCgiIpcDir)。そこで,/var/fcgi ディレクトリを作成することにする。
「chmod 777」がちょとやだな。通信用ソケットファイルのためのディレクトリは,FastCgiIpcDir ディレクティブで指定する。
Vine Linux 4.1 では,追加モジュールをインストールする場合,/etc/apache2/conf.d ディレクトリに設定ファイルを置くようになっている (設定ファイル httpd.conf に記述を追加してもよいが,モジュールの独立性が低下する)。ファイルの形式は,拡張子が .conf であることで,内容は httpd.conf に書くものと同じでよい。/etc/apache2/conf/httpd.conf でそれらのファイルがインクルードされる仕組みになっている。httpd.conf には Include ディレクティブが「Include conf.d/*.conf」という形で記述されている。
/etc/apache2/conf.d/fastcgi.conf ファイルを新たに作り,次の内容を記述する。
最初の「IfModule !mod_fastcgi.c」は,mod_fastcgi が2重にロードされることを防止しているだけである (設定したのに,忘れて httpd.conf に書いてしまうかも知れないから)。
mod_fastcgi がロードされると,「IfModule mod_fastcgi.c」が True になり,中のディレクティブが実行される。「/home/httpd/html ディレクトリ以下にある,拡張子が .cgi の全てのファイルに対し,fastcgi-script ハンドラをセットする」としている。最初,AddHandler にすればディレクトリ指定も不要だし楽チンということで「AddHandler fastcgi-script .cgi」としたのだが,動作しなかった。謎である。そのため,SetHandler となっている。
FastCgiConfig で指定するオプションはお好みで。チューニングはまだなので,ここでは暫定の値としている。ディレクティブについては,FastCGI ディレクティブ: IBM HTTP Server に詳しい解説がある。シックス・アパートに Movable Type に関する解説がある (FastCGI で Movable Type を動作させる)。
Apache を再起動すれば,DSO モジュールが動的に読み込まれて動作が始まる。
FastCGI を Perl から使えるようにするために,CPAN から Perl モジュールをインストールする。
FastCGI が動作しているかどうかは,CGI にアクセスしたときに /var/fcgi/dynamic ディレクトリ以下に新しくファイルが生成されていることで分かる。実際の動作については次のようなスクリプトで確認することができる。FastCGI (CGI Programming with Perl) にあるコードがそのまま使える。次の内容を書いて fast_count.cgi などの名前で保存し,実行許可を与える。
この CGI に繰り返しアクセスしたとき,カウンタの数値が変わっていけば FastCGI は動作していることになる。
FastCGI では,初期化のプロセスが1度しか実行されないからである。次の例は CGI.pm のインターフェースである CGI::Fast を使ったものである。
「new CGI::Fast」の前の処理は1度しか実行されない。これもアクセスの回数に応じてカウンタが上がる。
FastCGI の環境の下で Movable Type の動作はどうなったのか。正確には調べていない。体感だと,MTOS 4.1-en-boomer-r1114 (Movable Type Open Source) は,それほど早くなっているようには感じなかった。非常に重い。MT 2.661 はもっとよくなくて,反応が返ってこなくなってしまった。
インストールができることの確認はできたが,導入は見送ることにした。PersistentPerl を Apache 1.3 で動作させていたときは MT2 の動作は軽快になったので (nlog(n): mod_persistentperl で Movable Type を高速化),これに期待したのだが,PersistentPerl は 2003 年で開発が停止しており Apache2 ではコンパイルに失敗してしまう。パッチ適用でコンパイルできるようになる模様 (Apache2.2.2 + PersistentPerl2.22 on Cygwin - holidays-l開発ブログ)。しかし,後に動作しなくなったと追記されている。
上で設定した /etc/apache2/conf.d/fastcgi.conf の LoadModule の部分で本当にやりたいのは「mod_fastcgi.so ファイルが存在しないときにはロードしない」なのだが,できていない。それを書くには,Apache2 の起動スクリプトとの連携が必要になる。Apache 1.3 の起動スクリプトでは,実装されていた。抜粋すると次の部分になる。
modules ディレクトリを調べ,そこに .so ファイルがあったら,大文字にして HAVE_ をつけ,-D オプションで httpd に渡している。-D は Define の意味である。httpd の設定ファイルでは,IfDefine HAVE_... で分岐させて LoadModule できるようになっている (例 nlog(n): mod_persistentperl で Movable Type を高速化)。この実装ならば,例えば FastCGI をやめたいときは,単に modules/mod_fastcgi.so を削除するだけで,設定ファイルの変更は不要になるのだ。Apache2 の起動スクリプトでは,残念ながら方針変更があったようで,moduleargs() は削除されている (Apache 2.2.3 の起動スクリプト)。やりたければ自分で追加すればよいのだが…。
Posted by n at 2007-12-26 22:35 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957