印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType Apache2+mod_perl2 で MovableType 2.661

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

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


(必須, 表示されます)


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


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


Confirmation Code (必須)


Remember info (R)?