2007/09/06

続: MT4 + mod_perl2

8/28にここで書いたこと間違いだらけ.
そもそも, MT4はマルチスレッドなMPMを使用しているApache2上ではうごかない.

mod_perl2は, マルチスレッドMPM下では, カレントディレクトリが
実行対象のファイルのあるディレクトリにならないから, なんとかして
やらなければいけない.
PerlFixupHandlerディレクティブ内で, chdirしてやる手法がある.
<Directory "/path-to/mt">
  <Files ~ "mt(?!-config).*\.cgi$">
      SetHandler perl-script
  </Files>
  PerlResponseHandler ModPerl::Registry
  Options -Indexes ExecCGI
  PerlSendHeader On

  PerlFixupHandler "sub { \
    chdir('/path-to/mt/'); \
    return OK; \
  }"
  PerlSetEnv MOD_PERL 0
</Directory>

が, そもそもマルチスレッドMPM下では, 要求を処理するスレッドが
変更になり, 結局, カレントディレクトリがおかしくなる.

prefork MPM下ではその問題が出ないので,
PerlResponseHandler ModPerl::Registry
PerlResponseHandler ModPerl::PerlRun
ディレクティブの代わりに,
PerlResponseHandler ModPerl::RegistryPrefork
PerlResponseHandler ModPerl::PerlRunPrefork
を使用してやれば, カレントディレクトリが実行対象ファイルのある
ディレクトリになり, ちゃんと動くようになる.

先だっての記事で動いているように見えたのは, 正規表現の書き方が
間違っていて, mod_perl下で動いていなかったから.
<Files ~ "mt(?!-config).*\.cgi$">
であれば, mod_perl下で動くようになる.
でもうちのは, worker_mpmなのでNG

0 件のコメント: