MovableType 2.661 を Apache2+mod_perl2 で動作させる。動作が軽快になった。今後も MT2 を使い続ける方向で決定した。
■ ■ ■
今となっては懐かしさたっぷりの Movable Type 2.661 に Apache2+mod_perl2 の環境で動作させるパッチを適用してみることにした。
パッチはブログからダウンロードできる (Fenrir's BLog: MovableType 2.661をapache2+mod_perl2で動作させる)。MT-2.661.diff と追加の MT-2.661.CMS.pm.diff を MTPath (mt.cfg のあるディレクトリに) に置く。
環境は Vine Linux 4.2, Movable Type 2.661, Apache 2.2.3, Perl 5.8.6, mod_perl2 2.0.4, MySQL 5.0.27 である。
バックアップ
パッチ適用の前に,MT をディレクトリごとバックアップしておく。
パッチの適用
MT-2.661.diff の適用
メインの MT-2.661.diff を適用する。このサイトでは,ファイル変更時にはもとのファイルを日付をつけてバックアップするようにしているので,それに倣って -z オプションで今日の日付を指定している。
$ patch -p1 -z .20080731 < MT-2.661.diff
patching file lib/MT/App.pm
Hunk #2 FAILED at 42.
1 out of 11 hunks FAILED -- saving rejects to file lib/MT/App.pm.rej
patching file lib/MT/Builder.pm
Reversed (or previously applied) patch detected! Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
3 out of 3 hunks ignored -- saving rejects to file lib/MT/Builder.pm.rej
patching file lib/MT/ConfigMgr.pm
patching file lib/MT/Image.pm
Hunk #1 succeeded at 118 (offset 1 line).
patching file lib/MT.pm
patching file mt-add-notify.cgi
patching file mt-check.cgi
patching file mt-comments.cgi
patching file mt-search.cgi
patching file mt-send-entry.cgi
patching file mt-tb.cgi
patching file mt-view.cgi
patching file mt-xmlrpc.cgi
patching file mt.cgi
Hunk #1 succeeded at 6 with fuzz 1.
patch unexpectedly ends in middle of line
patch unexpectedly ends in middle of line
最初に lib/MT/App.pm のところでメッセージが出ている。2番目のパッチ適用に失敗している。これは行数が大きく違っているのが原因のようなので,改めて手で書き直す。
次の lib/MT/Builder.pm のメッセージは,適用済みの箇所があるということなので,パッチを適用しないように「n」で応答している。
lib/MT/Image.pm は1行違いだが,適用には成功している。行が違うのは独自ハックが原因。
mt.cgi にもメッセージが出ているが,成功しているので問題なし。
MT-2.661.CMS.pm.diff の適用
追加の MT-2.661.CMS.pm.diff を適用する。lib/MT/App/ にコピーしてから適用する。
$ mv MT-2.661.CMS.pm.diff lib/MT/App
$ cd lib/MT/App
$ patch -p0 -z .20080731 < MT-2.661.CMS.pm.diff
patching file CMS.pm
Hunk #2 succeeded at 2659 (offset 1 line).
Perl モジュールの追加
まずはそのままアクセス
Apache2 の設定を変更せずに,mt.cgi にアクセスする。すると,ブラウザに次のエラーが表示された。
Got an error: Base class package "Apache2::Request" is empty. (Perhaps you need to 'use' the module which defines that package first.) at /home/httpd/html/opentype/lib/MT/App.pm line 114 BEGIN failed--compilation aborted at /home/httpd/html/opentype/lib/MT/App.pm line 114, line 855. Compilation failed in require at /home/httpd/html/opentype/lib/MT/App/CMS.pm line 14, line 855. BEGIN failed--compilation aborted at /home/httpd/html/opentype/lib/MT/App/CMS.pm line 14, line 855. Compilation failed in require at /home/httpd/html/opentype/mt.cgi line 36, line 855.
Apache2::Request の読み込みに失敗している。
Apache2::Request のインストール
CPAN から Apache2::Request をインストールする。
# cpan -i Apache2::Request
同時に libapreq2-2.08 がインストールされた。実は,libapreq2 の make test で失敗してしまうのだが,無視してインストールしてしまうことにした (「test をキャンセルするか問い合わせてくるので「Yes」で応答するとできる。あまりよいことではないが…)。
改めて mt.cgi にアクセスすると,今度は管理画面が表示された。
動作確認
httpd.conf の書き換え
Apache2 の設定ファイル httpd.conf を書き換える。
<IfModule mod_perl.c>
PerlSetEnv MT_DIR /home/httpd/html/opentype/
PerlSetEnv MTConfig /home/httpd/html/opentype/mt.cfg
PerlModule ModPerl::Registry
PerlModule Apache::DBI
<Directory /home/httpd/html/opentype>
<Files *.cgi>
Options +ExecCGI
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlSendHeader Off
</Files>
</Directory>
</IfModule>
何も表示されない
Apache2 を再起動する。Apache2::Status で見ると (mod_perl: Apache2::Status),mod_perl2 はロードされているが,MT::* が見当たらない。MT は mod_perl2 上で動いていないようだ。ブラウザで管理画面にアクセスすると真っ白な画面が表示された。何も表示されない。
mod_apreq2 のロード
画面が真っ白になる原因は,Apache2 で mod_apreq2 をロードしていないからだった。ブラウザの表示が真っ白になるときは,多くの場合,必要なモジュールやライブラリがインストールされていないかロードされていないかのどちらかが原因である (nlog(n): ダイナミックパブリッシングにすると画面が真っ白に,nlog(n): カレンダーが真っ白に)。httpd.conf に次の行を追加する。
LoadModule apreq_module modules/mod_apreq2.so
Apache2 を再起動して,Apache2::Status で確認。MT::* モジュールもロードされた。メデタシメデタシ。
パッチ適用後の修正
Apache2 のログを見ると,次のようなメッセージが出ていた。
Odd number of elements in anonymous hash at /home/httpd/html/opentype/mt.cgi line 9.
無名ハッシュの要素が奇数だと言っている。ハッシュであればキーと値が対になるので偶数になるはずである。該当箇所は次になる。
use constant MP2 => {exists $ENV{MOD_PERL_API_VERSION} and
$ENV{MOD_PERL_API_VERSION} >= 1.99};
おそらく括弧が {} になっているのが原因ではないかと思われる。次のように () に変えるとメッセージが出なくなった。
use constant MP2 => (exists $ENV{MOD_PERL_API_VERSION} and
$ENV{MOD_PERL_API_VERSION} >= 1.99);
lib/MT/App.pm, lib/MT/App/CMS.pm についても同様。
謝辞
パッチを作成された Fenrir Naruokaさんに感謝する。ニッチな需要に応えてくれてありがとう! 素晴らしい!!
まだまだ使える MT2。しかし,もうダウンロードはできない。管理画面の下のバナーには「Version 2.661 Copyright © 2001-2003 Six Apart. All Rights Reserved.」という5年前の表示が…。遠い目。
それにしても,このパッチの作成はどうやっているのだろうか? 「オリジナル」→「いろいろハック」→「mod_perl2 ハック」でパッチを作ると,「オリジナル」→「mod_perl2 ハック」と行番号がずれてしまうからだ。
Posted by n at 2008-08-01 01:33 | Edit | Comments (0) | Trackback(0)