May 09, 2008

MovableType 2.661をapache2+mod_perl2で動作させる

リクエストを戴きましたので、MovableType 2.661(以下MT 2.661)をapache2+mod_perl2上で動作させるまでに行った記録を記しておこうと思います。おそらく相当ニッチな要望だと思いますが(笑)。

コトの経緯を軽く説明しておきますと、MT 2.661はかなり古いCMSですが、このサイトのMT 2.661は自分の使い勝手がいいようにかなり改造を施してしまったので、なかなか最新バージョンに移ろうという気になれないでいました。そうこうしているうちにサーバーを最近立て替えたこともあり、以前のapache1.3 + mod_perl1.3環境から卒業してapache2+mod_perl2に対応する必要がてできました。その後MT自体は進化をとげメジャーバージョンが4になり、新しい環境にも標準で対応しているようなのですが、やはり使い慣れたMT 2.661を使い続けたい、だから移植しよう、というのがこの記事の動機となっています。

とりあえずapache1.3+mod_per1.3からapache2+mod_perl2にl変更するにあたってポイントとなる点は大きく2つに大別できると思います。

1つはapache2では並行動作のモードが複雑になった(従来のprefork動作以外にもmulti-thread動作等が選べる)ため、その上で動くmod_perl2がスクリプトを起動方法が変更になったようです。特にスクリプトを書く側にとって深刻な点は、起動時のディレクトリが必ずしもスクリプトの存在するディレクトリにならないことです。MT 2.661においても例外ではなく、MT 2.661では動作に必要となるサブモジュールの位置を、スクリプトが存在するディレクトリからの相対パスで求めているため、これは非常に大きな問題となります。先達はchdirでなんとか解決しようとされたり、apache2の構成方法にもよりますが従来どおりの動作が期待されるPrefork版のPerlハンドラを渡して解決しようとされたりしています(chdirが好ましくないことやPrefork版モジュールは本家mod_perl2のサイトで言及されています)。

もう一つの問題はmod_perl2でAPIの名前や動作がかなり変更されたことです。名前が変更されたことは書き換えで対応すればよいようで、これも先達によって『MT3.3をmod_perl2で動かすpatch(その1)』等で書き換え方法が公開されています。動作の変更点としては、MT 2.661で状態遷移を記録するために使用していたApache::Request::paramというものがありますが、Apache2::Request::paramでは変数を足すことができなくなった(『Apache2::Request PORTING from 1.X』参照)のが響いています。

以上2点を踏まえて、apache2+mod_perl2上でMT 2.661を動作するようにしました。変更点をまとめたdiffファイル(patchコマンドで適用可能形式)を公開するとともに、apache2+mod_perl2側の設定を以下に示します。

PerlSetEnv MT_DIR /usr/local/share/web/MovableType/
PerlSetEnv MTConfig /usr/local/share/web/MovableType/mt.cfg
Alias /mt/ "/where/to/mt/"
PerlModule ModPerl::Registry
PerlModule Apache::DBI
<Directory "/where/to/mt/">
    <Files *.cgi>
        SetHandler perl-script
        PerlResponseHandler ModPerl::Registry
        PerlSendHeader Off
    </Files>
</Directory>
<Location /mt>
    Options ExecCGI
    Order Allow,Deny
    Allow from all
</Location>
<Location /mt/db>
    Order Deny,Allow
    Deny from all
</Location>

1つ目の問題点、実行時のディレクトリの問題については環境変数渡し+@INCをスクリプト内で変更することでサブモジュールを見えるようにしました。@INCの変更はBEGINブロックで対応しないようにしましたが、これは『[perl]ModPerl::{PerlRun,Registry,RegistryPrefork}でのカレントディレクトリ、BEGINブロック、@INCの扱いメモ』に基づいています。
今回示した解決方法以外にも、試してはいませんがPerlOptions +Parent と PerlSwitches -I(mt/lib) 等を使った解決方法が考えられると思います。

2つ目の問題点は、先達の書き換え方法、並びにApache2::Requestに対して、paramが書き換え可能なApache2::RequestSubclassというラッパークラスを定義することで対応しました。このアイデアは『Apache2::Request::param で set / add できない』より戴きました。

問題点がでてきたら変更を考えていますが、以上の作業で現在のところ問題なく動作しています。

※ファイルのアップロードでこけることがありました。またしてもメソッド名が変更(size => upload_size、fh => upload_fh)になっていたようです。上記diffに追加してMT-2.661.CMS.pm.diffも mt/lib/MT/App/CMS.pm に対して適用してください。

10:06 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/638
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。