MovableType3.35をmod_perlで動かす(1/2)

今週、某サイトの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/

PerlModule Apache::Registry
<Location /perl/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
PerlSendHeader On
Allow from all
</Location>


httpd.confを書き換えて、httpdを再起動して、ローカルで既存の簡単なPerlのCGIにhttp://localhost/perl/….cgiというURLでアクセスすると、CGIとして動作させた場合と同じ出力が得られた。なお、あらゆるPerl CGIがそのまま動くわけではないので注意が必要だ。


●Apache::Request, Apache::Cookieのインストール
MovableType3.2のマニュアルによると、mod_proxy(Apache::Registry)を使ってMovableTypeを動かすには、PerlモジュールのApache::RequestとApache::Cookieが必要だ。
Perlモジュールのインストールは、CPANのシェルを使って、下記の要領でできる。

> perl -MCPAN -e shell
cpan[1]> install Apache::Request Apache::Cookie

cpanコマンドが存在する場合は、下記のようにしてもできる。
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
<Location /cgi-bin/mt/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>

を追加して、httpdを再起動してブラウザからhttp://…/cgi-bin/mt/mt.cgiにアクセスすると、MovableTypeのログイン画面は表示されたが、ログインすると、ページが見つからないというエラーになり、その後はログイン画面も表示されなくなった。
Perlのプロセスは新規に立ち上がることは無く、httpdのプロセスにPerlが常駐しているらしいことが確認でき、他のPerlスクリプトはmod_perl経由で正常に実行できたので、常駐してるMovableTypeがおかしな状態になったようだった。
CGIの設定と不整合を起こしてるのかと思い、httpd.confの設定を

Alias /perl/ /…/perl/ # out of cgi-bin directory

PerlModule Apache::Registry
<Location /perl/mt/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>


という風にして、MovableTypeをApacheのcgi-binディレクトリ以外の所に移して試したが、動作は変わらなかった。