MT の Apache2 + mod_perl2 化、成功?

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_PERL0 に上書きし、 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 を適用すると問題が発生するものと思われる。 (未確認)

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

22個のコメント

  1. 2005-08-03 10:34 に投稿 | パーマリンク

    MTのmod_perl2化

    以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…

  2. 2005-08-03 10:34 に投稿 | パーマリンク

    MTのmod_perl2化

    以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…

  3. 2005-08-03 10:34 に投稿 | パーマリンク

    MTのmod_perl2化

    以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…

  4. 2005-08-03 10:34 に投稿 | パーマリンク

    MTのmod_perl2化

    以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…

  5. 2005-08-03 10:34 に投稿 | パーマリンク

    MTのmod_perl2化

    以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…

  6. 2005-08-03 10:34 に投稿 | パーマリンク

    MTのmod_perl2化

    以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…

  7. 2005-08-03 10:34 に投稿 | パーマリンク

    MTのmod_perl2化

    以前ソースをいじって諦めた MTのmodperl2化ですが、 ダメ出し日記: MT の Apache2 modperl2 化、成功? MT の Apache…

  8. 2005-10-17 23:56 に投稿 | パーマリンク

    Apache2 で mod_perl2

    検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…

  9. 2005-10-17 23:56 に投稿 | パーマリンク

    Apache2 で mod_perl2

    検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…

  10. 2005-10-17 23:56 に投稿 | パーマリンク

    Apache2 で mod_perl2

    検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…

  11. 2005-10-17 23:56 に投稿 | パーマリンク

    Apache2 で mod_perl2

    検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…

  12. 2005-10-17 23:56 に投稿 | パーマリンク

    Apache2 で mod_perl2

    検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…

  13. 2005-10-17 23:56 に投稿 | パーマリンク

    Apache2 で mod_perl2

    検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…

  14. 2005-10-17 23:56 に投稿 | パーマリンク

    Apache2 で mod_perl2

    検索をかけていたら、ダメ出し日記: MT の Apache2 + mod_per…

  15. 2006-04-16 01:38 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

  16. 2006-04-16 01:38 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

  17. 2006-04-16 01:38 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

  18. 2006-04-16 01:38 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

  19. 2006-04-16 01:38 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

  20. 2006-04-16 01:38 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

  21. 2006-04-16 01:38 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

  22. 2006-04-16 01:39 に投稿 | パーマリンク

    mod_perl で chdir

    mod_perl2 でスマートに chdir

コメントを書く

Your email is never shared. * 印の項目は必須項目です。

*
*