MT は mod_perl1 に対応しているが、 mod_perl2 には対応しておらず、動作さえしない。 次のような問題があるのが理由:
- MT には modperl1 対応のコードが含まれているが、 そのコードが modperl2 環境下でも実行されてしまう。 (modperl1 と 2 とで API の互換性がない)
- MT は、スクリプト実行時のカレントディレクトリがスクリプトが置かれているディレクトリであることを期待している。 (modperl2 は、カレントディレクトリを変更しない)
MT を改造して modperl2 対応を試みた例がいくつかあるようだが、 成功例はないみたい。 そこで、以下のような Apache2 + modperl2 設定を考えてみた。
PerlSwitches -I./extlib -I./lib
<VirtualHost *:80>
ServerName www.sfo.jp
...
<DirectoryMatch "^/project/sfo/www/www.sfo.jp/(lib/mt|var/mt/blog)">
Order Mutual-Failure
Allow From All
<Files *.cgi>
Options +ExecCGI
SetHandler perl-script
PerlFixupHandler "sub { \
chdir('/project/sfo/www/www.sfo.jp/lib/mt'); \
return OK; \
}"
PerlResponseHandler ModPerl::Registry
PerlOptions -ParseHeaders
PerlSetEnv MOD_PERL 0
</Files>
</DirectoryMatch>
...
</VirtualHost>
簡単に解説すると、以下のような hack になる:
-
環境変数
MOD_PERLを0に上書きし、 MT の mod_perl1 対応コードが実行されないようにする。 - MT の実行 (PerlResponseHandler) の前 (PerlFixupHandler) に、 カレントディレクトリを MT のディレクトリに移動する。
- PerlSwitches は必要ないと思うのだが、ないとモジュールのロードに失敗することがある。何故だ…。
- MT の改造は必要なし!
現在、当サイトの MT は上記のような設定で動作している。
mod_perl2 に対応しているモジュールは、 以下のように mod_perl 判定するのが一般的なようなので、 それらはちゃんと mod_perl2 の API を利用してくれるはず:
if (exists $ENV{MOD_PERL}) {
eval "require mod_perl";
if (defined $mod_perl::VERSION) {
if ($mod_perl::VERSION >= 1.99) {
...mod_perl2 対応のコード...
} else {
...mod_perl1 対応のコード...
}
}
問題点が 1つ。chdir の結果はスレッドローカルではなくなるため、
Apache2 の MPM が worker の場合、
複数の MT にこの hack を適用すると問題が発生するものと思われる。
(未確認)





22個のコメント
MTのmod_perl2化
以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…
MTのmod_perl2化
以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…
MTのmod_perl2化
以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…
MTのmod_perl2化
以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…
MTのmod_perl2化
以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…
MTのmod_perl2化
以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…
MTのmod_perl2化
以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…
Apache2 で mod_perl2
検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…
Apache2 で mod_perl2
検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…
Apache2 で mod_perl2
検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…
Apache2 で mod_perl2
検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…
Apache2 で mod_perl2
検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…
Apache2 で mod_perl2
検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…
Apache2 で mod_perl2
検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…
mod_perl で chdir
mod_perl2 でスマートに chdir
mod_perl で chdir
mod_perl2 でスマートに chdir
mod_perl で chdir
mod_perl2 でスマートに chdir
mod_perl で chdir
mod_perl2 でスマートに chdir
mod_perl で chdir
mod_perl2 でスマートに chdir
mod_perl で chdir
mod_perl2 でスマートに chdir
mod_perl で chdir
mod_perl2 でスマートに chdir
mod_perl で chdir
mod_perl2 でスマートに chdir