印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
LinuxMovableType FastCGI を Vine Linux 4.1 にインストール

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 のインストールと Apache2 の設定

コンパイルとインストール

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 用のインストール手順) の通りに進める。

$ tar zxf mod_fastcgi-2.4.6.tar.gz
$ cd mod_fastcgi-2.4.6
$ cp Makefile.AP2 Makefile
$ make top_dir=/etc/apache2
# make top_dir=/etc/apache2 install

最後の make install で,mod_fastcgi.so が /etc/apache2/modules (実際は /usr/lib/apache2/modules) にコピーされる。

ソケットファイルディレクトリの作成

FastCGI は,通信用ソケットファイルを動的に生成する。デフォルトでは,/tmp/fcgi に作成されるが,/tmp 以下にファイルを置いておくと消えてしまうことがある (zwiki: FastCgiIpcDir)。そこで,/var/fcgi ディレクトリを作成することにする。

# mkdir /var/fcgi
# chown apache.apache /var/fcgi
# chmod 777 /var/fcgi

「chmod 777」がちょとやだな。通信用ソケットファイルのためのディレクトリは,FastCgiIpcDir ディレクティブで指定する。

Apache2 の設定

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>
LoadModule fastcgi_module modules/mod_fastcgi.so
</IfModule>

<IfModule mod_fastcgi.c>
<Directory /home/httpd/html>
<FilesMatch "\.cgi$">
  SetHandler fastcgi-script
</FilesMatch>
</Directory>
FastCgiIpcDir /var/fcgi
FastCgiConfig -autoUpdate -idle-timeout 120 -killInterval 300 -maxClassProcesses 4
</IfModule>

最初の「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 の再起動

Apache を再起動すれば,DSO モジュールが動的に読み込まれて動作が始まる。

# /etc/init.d/apache2 restart

Perl モジュールのインストール

FastCGI を Perl から使えるようにするために,CPAN から Perl モジュールをインストールする。

# cpan -i FCGI
# cpan -i CGI::Fast

動作確認

FastCGI が動作しているかどうかは,CGI にアクセスしたときに /var/fcgi/dynamic ディレクトリ以下に新しくファイルが生成されていることで分かる。実際の動作については次のようなスクリプトで確認することができる。FastCGI (CGI Programming with Perl) にあるコードがそのまま使える。次の内容を書いて fast_count.cgi などの名前で保存し,実行許可を与える。

#!/usr/bin/perl -wT

use strict;
use vars qw( $count );
use FCGI;

local $count = 0;

while ( FCGI::accept >= 0 ) {
    $count++;
    print "Content-type: text/plain\n\n";
    print "You are request number $count. Have a good day!\n";
}

この CGI に繰り返しアクセスしたとき,カウンタの数値が変わっていけば FastCGI は動作していることになる。

You are request number 4. Have a good day!

FastCGI では,初期化のプロセスが1度しか実行されないからである。次の例は CGI.pm のインターフェースである CGI::Fast を使ったものである。

#!/usr/bin/perl -wT

use strict;
use vars qw( $count );
use CGI::Fast;

local $count = 0;

while ( my $q = new CGI::Fast ) {
    $count++;
    print $q->header( "text/plain" ),
          "You are request number $count. Have a good day!\n";
}

「new CGI::Fast」の前の処理は1度しか実行されない。これもアクセスの回数に応じてカウンタが上がる。

Movable Type の動作は

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 の起動スクリプトでは,実装されていた。抜粋すると次の部分になる。

moduleargs() {
    moduledir=/usr/lib/apache
    moduleargs=`
    /usr/bin/find ${moduledir} -type f -perm -0100 -name "*.so" | awk '{\
        gsub(".*/","");\
        gsub("^mod_","");\
        gsub("^lib","");\
        gsub("\.so$","");\
        print "-DHAVE_" toupper($0)}'`
    echo ${moduleargs}
}
start() {
    echo -n $"Starting $prog: "
    daemon $httpd `moduleargs` $OPTIONS
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd
    return $RETVAL
}

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)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?