Apache に mod_perl を導入すると、MovableType の編集モードの動作が速くなるらしい。Vine Linux の場合、mod_perl はインストールできるのだが、Movable Type が動かない。DB_File.pm 関連のエラーが出てしまう。最終的には、簡単な設定をするだけで動作することが分かった。しかし、それまでの道が長かった。
mod_perl の環境で MT を動作させる方法については、オリジナルのマニュアル その他の環境 - mod_perl に記述がある。導入事例を紹介しているサイトには MovableType を mod_perl (Apache::Registry) 環境下で動かす方法 : NDO::Weblog や Fenrir's BLog: mod_perlで高速化 があり、大変分かりやすく解説されている。しかし、まずはマニュアルにしたがってやってみたい。
環境は Vine Linux 2.6、Movable Type 2.661 で、Movable Type では Berkeley DB を使うとする。
まず、Apache のインストール状況を確認する。
mod_so.c が表示されているので、DSO (Dynamic Shared Object) に対応していることが分かる。DSO の場合、起動時に動的にモジュールを読み込むため、新しいモジュールを追加する場合でも Apache を再コンパイルする必要がない。
mod_perl をインストールする。すでにインストールされているかは、/etc/httpd/modules ディレクトリに libperl.so があるかどうかで判断することができる。あればインストール済みである。存在しない場合は新規インストールを行う。mod_perl は VinePlus に収録されているので、近くの Ring サーバを選んでダウンロードし、
普通にインストールすることができる。
動作を確認するには、/etc/httpd/conf/httpd.conf を編集し、<IfModule mod_perl.c> ... </IfModule> の間に赤色部分を追加する。
構文チェックを行って再起動する。
上で設定したロケーションに、ブラウザでアクセスする。
Apache::Status の画面になり「Embedded Perl version v5.6.1 for Apache/1.3.27 (Unix) (Vine/Linux) mod_ssl/2.8.14 OpenSSL/0.9.6m mod_perl/1.26 process 31198」などと表示されれば成功である。「Loaded Modules」をクリックすると、メモリにロードされているモジュールの一覧が表示される。
Devel::Symdump モジュールがインストールされていれば、さらにパッケージの内容まで見られるので楽しい。Devel::Symdump の導入は CPAN からネットワークインストールするのが便利。
動作確認が終わったら、セキュリティ向上のために、httpd.conf を編集して上記で追加した部分を削除するか、Location で指定した perl-status という名称を変更しておく方がいいかも知れない。Apache 関連の情報がかなり分かるからである。
mod_perl がインストールできたので、その上で Movable Type を動作させる準備を行う。マニュアルには Apache::Request とApache::Cookie モジュールが必要だとある。CPAN から Apache::Request をインストールしようとしたが、最後の make test で失敗してしまう(後に分かったことだが,LANG=C によって言語の設定を解除しておけば make test を通すことができる)。そこで、Apache HTTP Request Library - The Apache HTTP Server Project から libapreq-1.3 をダウンロードする。
コンパイルして問題なくインストールすることができる。
準備ができたので、/etc/httpd/conf/httpd.conf を編集し、上記の perl-status の下に次のコードを追加する (perl-status 部分は省略)。このサイトでは Movable Type の CGI のディレクトリを opentype という名前にしている。
Vine Linux では、何故か「PERL5LIB」でのライブラリ指定ができなかった。そこで、「use lib」を使って同じ動作をさせた。ライブラリを読み込んでいるかについては、perl-status の「Apache::Status」画面で「Loaded Modules」をクリックし、一番したの「@INC」にディレクトリが追加されているかどうかで確認することができる。
最初は、この追加コードをバーチャルサーバの中に書いていたのだが、違うバーチャルサーバでも mod_perl が有効になっていたので、バーチャルサーバ内に追加するのは止めにした (逆に考えれば、複数のバーチャルサーバで異なる設定の mod_perl を動作させることは難しいということか)。
これで完了のはずなので、動作確認のために Movable Type の編集画面にアクセスした。するとエラーが表示された。
メッセージを読むと、「MT::ObjectDriver::DBM」モジュールを使用する際に「DB_File」を読み込むのだが、これがエラーを吐いていることになっている。DB_File が読み込もうとするライブラリとヘッダファイルのバージョンが合っていないというのである。ヘッダ db.h のバージョンは 3.2.9 で、ライブラリ libdb のバージョンは 2.4.14 なのである。
そこで、DB_File がリンクしているファイルを調べてみることにした。
libdb-3.2.so がリンクされている。したがって、Apache が起動時に読み込んでいるライブラリがマズそうだということが分かる。何故 libdb-2.4 などを読み込んでしまうのだろうか。mod_perl を使わなければ、問題なく DB_File は libdb-3.2 を使ってくれるのである。
Vine Linux のデータベース用ライブラリを調べてみると、db1, db2, db3 がインストールされていることが分かった。
以下のような試行錯誤を行った。
ここまでやっても上手く行かない。英語のサイトも探したが「どうしたらいい?」の質問ばかり。途方に暮れていたのだが、「Apache を起動する前に db3 ライブラリを読み込めばいいのではないか」ということに気がついた。
/etc/sysconfig/apache ファイルを新たに作り、中に次のように書いておく。
起動スクリプト /etc/init.d/httpd は、/etc/sysconfig/apache ファイルがあれば最初に読み込むようになっている。直接起動スクリプトに追加するより美しい。
これで問題が解決した。めでたく mod_perl の上で Movable Type が動作するようになった。
編集画面が表示され、新規エントリの作成や再構築もできるようになったのだが、「B」や「i」などの編集ボタンが表示されないことが分かった。そこで、<File> ディレクティブを使って、mod_perl を使うのは拡張子が .cgi のファイルだけに限定しようとしたところ、「<Location> ディレクティブ内では <File> ディレクティブは使えない」というエラーで Apache の起動に失敗した。<File> ディレクティブを使いたいのであれば、<Directory> ディレクティブを使わなければならないのである。
最終的には以下のようになった。
ここまで来て、なぜ他のサイトで <Directory> ディレクティブを使っている意味が分かったのである。分かるのが遅すぎる。「PerlSendHeader Off」については検討中。
現在、このサイトの記事は243個ある。ThinkPad 600 (Pentium II 233 MHz, メモリ 160 MB) [仕様: PCサポート - ThinkPad 600(2645-41J) - 製品仕様] ですべてを再構築すると7分かかる。mod_perl を導入して、再度計測してみたが、同じ7分であった。再構築の時間は速くならないようだ。ただし、編集メニューの表示、プレビュー表示などの速度は劇的に向上した。記事は増える一方であるが、全体を再構築しなければ記事の構築時間は今と変わらないはずである。だがしかし…。今後どうやって運用していくか悩むところである。
CGI の高速化には SpeedyCGI という方法もある。MovableType の高速化としては、Barkeley DB を捨てるという方法もあるようだ。
2005年11月12日追記:
Vine Linux 3.2 (kernel 2.4.31) では mod_perl を上手く導入できなかったため,Speedy CGI の後継である PersistentPerl を導入しました(nlog(n): mod_persistentperl で Movable Type を高速化)。
Master Archive Index
Total Entry Count: 1957