今週、某サイトのApacheの記事を読んでいて、mod_proxyというモジュールに興味を惹かれてApacheのマニュアルやhttpd.confを眺めてると、mod_perlという単語が目に止まった。この単語は私にはかなり昔から見覚えがあって、何だろうこれは、とずっと気になっていたので、少し調べてみると、どうやらApacheのモジュールで、Perlのプロセスを常駐させてCGIを速く動かせるもののようだった。(あくまでmod_perlの利点の1つで、mod_perlの役割はそれだけではない)
ということは、CGIとJavaのServletを比べた場合にServletの利点とされる、HTTPサーバーの一部として動くことによる効率の良さが、Perlでも実現できるということだ。(PHPを使ってる人は何を今更と言うかも知れないが)
このサーバー(CPU: Pentium 150MHz, OS: FreeBSD 4.11)では、これまでMovableTypeが遅く、管理画面でサーバーにアクセスする度に14秒以上かかっており、何かいい方法が無いものかと思っていたので、MovableTypeをmod_perlで動かせないかと思い、Webで調べてみると、Six ApartのMovableType3.2のマニュアルにやり方が書いてあった。
今日、早速それに従って試してみた。
上記のマニュアルには、MovableTypeをmod_perlで動かす方法として、Apache::Registryを使う方法と、MovableType自体をPerlHandlerとする方法の2つが書いてあり、前者の方が手軽にできそうだったので、まずApache::Registryを使う方法を試そうとした。
結論としては、この方法はうまくいかなかった。
●mod_perlのインストール
MovableType3.2のマニュアルによると、MovableTypeを動かすにはmod_perlのバージョンが1.xでないといけないので、今回はFreeBSDのportsを使ってバージョン1.3をインストールした。mod_perl 1.xを使うにはApacheは1.xである必要があるが、元々1.3を使っていたので問題なかった。
mod_perlの動作確認は、mod_perlのページに従って、以下のような設定をhttpd.confの末尾に追加して試した。
(インデントは省略)
Alias /perl/ /.../cgi-bin/httpd.confを書き換えて、httpdを再起動して、ローカルで既存の簡単なPerlのCGIにhttp://localhost/perl/....cgiというURLでアクセスすると、CGIとして動作させた場合と同じ出力が得られた。なお、あらゆるPerl CGIがそのまま動くわけではないので注意が必要だ。PerlModule Apache::Registry
<Location /perl/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
PerlSendHeader On
Allow from all
</Location>
●Apache::Request, Apache::Cookieのインストール
MovableType3.2のマニュアルによると、mod_proxy(Apache::Registry)を使ってMovableTypeを動かすには、PerlモジュールのApache::RequestとApache::Cookieが必要だ。
Perlモジュールのインストールは、CPANのシェルを使って、下記の要領でできる。
> perl -MCPAN -e shellcpanコマンドが存在する場合は、下記のようにしてもできる。
cpan[1]> install Apache::Request Apache::Cookie
cpan -i Apache::Request Apache::Cookie
CPANによるインストールには、このサーバーではRAMの空きが60M~70M程度必要だった。メモリ不足になると、メモリ不足だとわかるメッセージを出さずに、"Killed."とだけ出て終了してしまう。
なお、root権限で、作業ディレクトリをroot権限でしかアクセスできない場所(/rootとか)にして、CPANを使ってApache::Requestをインストールしようとすると、途中のmake testの時に
[ error] You are running the test suite under user 'root'.
The problem is that the path (including all parent directories):というエラーが出る。しかし、
/root/.cpan/build/libapreq-1.33/t
must be 'rwx' by user 'nobody', so Apache can read and write under that path.
Skip the test suite? [No]と尋ねられた時に"Yes"と答えれば、インストールは続行できる。今回は、インストールした後に、作業ディレクトリを/usrに移して、make testだけ手動で起動して全てOKとなることを確認した。
やはりコンパイルまではユーザー権限で行って、インストールだけをrootで行うべきだった。一般論としても、その方がインストール準備まででトラブルが発生してもシステムに影響が無いようにできるので、rootでのコンパイルは避けるべきである。
●mod_perlの設定(Apache::Registry)
MovableType3.2のマニュアルに従い、httpd.confの末尾に
PerlModule Apache::Registryを追加して、httpdを再起動してブラウザからhttp://.../cgi-bin/mt/mt.cgiにアクセスすると、MovableTypeのログイン画面は表示されたが、ログインすると、ページが見つからないというエラーになり、その後はログイン画面も表示されなくなった。
<Location /cgi-bin/mt/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
Perlのプロセスは新規に立ち上がることは無く、httpdのプロセスにPerlが常駐しているらしいことが確認でき、他のPerlスクリプトはmod_perl経由で正常に実行できたので、常駐してるMovableTypeがおかしな状態になったようだった。
CGIの設定と不整合を起こしてるのかと思い、httpd.confの設定を
Alias /perl/ /.../perl/ # out of cgi-bin directoryという風にして、MovableTypeをApacheのcgi-binディレクトリ以外の所に移して試したが、動作は変わらなかった。PerlModule Apache::Registry
<Location /perl/mt/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
コメント