Movable Typeのログインが遅い件の対応 + Apache2、mod_perl2導入 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

無事にインストールし、色々利用してみているMovable Type(Version3.3)ですが前々から管理サイトへのログインが異常に遅いと言う現象が発生していました。(30秒から1分ほど)


mt-check.cgiでシステムを確認してみても、特にPerlモジュールが不足しているなどといった事はなさそうでした。

Webで調べてみると、Movable Typeは遅いのでmod_perlで高速化しようみたいな記事をチラホラ見かけていたので、初期状態ではこんなものなのかなと思い放置していたのですが、さすがに重過ぎるという意見が出始め対応することに。


まぁ、確かに通常でログインに30秒以上もかかるようなシステムをお金出して納得して使われる事はまずないかと思うのですが・・・。


結果から言うと、管理サイトのTOPページで読み込まれる「MOVABLE TYPEニュース」の項目が悪さをしているようでした。
Movable Typeの設定ファイルであるmt-config.cgi内に下記を追加


NewsboxURL disable 

・・・サクサク動く・・・この2日間mod_perl2の導入(後述)に悪戦苦闘していた自分はいったい・・・

一番最初に、「Movable Type 遅い」などのワードで検索したのが悪かったです・・・。

「Movable Type ログイン 30秒」で検索したら、該当のページ が一発で出てきました・・・。


ちなみ、Proxyを利用して外部に接続する必要がある環境で、Newsを表示したい場合は、先ほど設定した「NewsboxURL」の項目を削除又はコメントアウトしHTTPProxy の設定をすればよいようです。(私の環境ではProxyで引っかかってた模様)


ここまでで、私が悩んでたことについては解決したのですが、その前に悪戦苦闘していたApache2+mod_perl2の導入によるMovable Typeの高速化というものも簡単に触れておきます。


注) 結局のところApache2+mod_perl2+Movable Type3.3という環境では動作させる事ができませんでした。

   対応していない旨がマニュアル に書いてあります。

   取り合えず作業ログみたいなものと、誰かがここを訪れてくれて、方法を教授してくれないかなぁなどと期待しつつ

   書いています。



初めに、環境としては「Movable TypeでオリジナルBlogを作る 【環境設定編】」 で触れたものと同様です。

(OSがRedHat ES4、Apacheは2.0.52でRPMで入れたもの)


まず、mod_perlがインストールされていなかったので、これをインストールします。

RedHatES4では、mod_perlがRPMパッケージで提供されていたのですが、このバージョンが1.99でこれが、後述するCPANのApache2::Requestパッケージで対応していませんでした。


※ mod_perlは、現在Apache1.x系用のmod_perl1とApache2.x系用のmod_perl2の他にmod_perl2が出るまでのベータ版

  という位置づけで、mod_perl1.99というものが存在しています。ただし、mod_perl2とmod_perl1.99に互換性はありません。


※ RPMパッケージ管理についての詳細については、「up2dateによるRPMパッケージの更新管理 」も参照してみてください。


仕方がないので、CPANのmod_perl2をインストールする事に。

ただ、CPANのmod_perl2をインストールするには、Apacheのapxsコマンドが必要になります。

これが入っていなかったので、先にこちら(httpd-develパッケージ内に含まれる)をインストール。

既に存在するなら問題はないです。


$ up2date -i httpd-devel

これで、mod_perl2をインストールできます。


$ cpan

cpan> install mod_perl2

途中、apxsコマンドのパスを聞いてきますので、入力(上記のとおりRPMパッケージで入れた場合は(/usr/sbin/apxs)


次に、CPANのApache2::Requestパッケージをインストールします。


cpan> install Apache2::Request

※ このパッケージもApache1.x系用のApache::RequestとApache2.x系用のApache2::Requestという2つが存在します。

  mod_perl2を入れているのに、Apache::RequestをインストールしようとするとPlease install mod_perl: 1.25 < version < 1.99

  のように、mod_perlのバージョンが違うと言われインストールが中断します。



最後にインストールした、mod_perl2をApacheが利用するように設定ファイル(httpd.conf)を編集します。
「LoadModule」とづらづらと書かれた行の最後にでも


LoadModule perl_module modules/mod_perl.so

と定義します。


次に、同じくhttpd.conf内でmod_perlを使うディレクトリを指定します。


PerlModule ModPerl::Registry
<Directory /cgi-bin/path/>
<Files *.cgi>
SetHandler perl-script
</Files>
PerlHandler ModPerl::Registry
Options +ExecCGI
</Location>

※ VirtualHostを使用している場合は、その対象となるVirtualHost内で定義します。

  Directoryで指定するパスは、mod_perlを利用したいCGIファイルが置かれているディレクトリを指定します。


上手く動作しているかを確認したければ、httpd.conf内に下記を追加します。


<Location /perl-status>
SetHandler perl-script
PerlHandler Apache2::Status
</Location> 

http://hogehoge.com/perl-status のように指定すれば、mod_perlの状況が確認できます。


編集後は、Apacheを再起動します。


しかし、この時点で再起動を行うとエラー発生


$ /etc/init.d/httpd restart
httpd を停止中: [失敗]
httpd を起動中: [Thu Mar 08 19:18:10 2007] [error] Can't locate Apache/Registry.pm in @INC (@INC ・・・
[失敗]

CPANのApache::Registryを参照しようとして、そんなの存在しないといっています。

httpd.conf内でApache2とModPerlのパッケージを参照するようには指定していますが、Apacheのパッケージは特に指定していません。

これを指定している箇所を探してみると・・・CGI.pm内で指定していました。

(RedHatのRPMのパッケージでPerlを入れていたせいで、mod_perl1.99用に書かれているっぽいです)


CGI.pm内のmod_perlバージョンを確認し、参照する先のパッケージがApacheを指定している


if ($mod_perl::VERSION >= 1.99) {
$MOD_PERL = 2;
require Apache::Response;
require Apache::RequestRec;
require Apache::RequestUtil;
require APR::Pool;
} else {
$MOD_PERL = 1;
require Apache;
}

なので、CPANから今度は、CGI.pmをインストール


cpan> install CGI

これで、Apache2系+mod_perl2で一応動作はしているようなのですが、Movable Typeを動作させようとMovable Typeのアプリケーションディレクトリに対して、mod_perlの設定を追加し見るも動作せず。

ここで改めてMovable Typeのマニュアル を見てみると、mod_perl2では動作しない事が判明・・・。

まぁ、問題視していたことについては解決したので良いんですがね。


※ できたと言う方もいらっしゃるようです。


  MT の Apache2 + mod_perl2 化、成功?


今のところMovable Type自体は全然重くないので、mod_perlの導入については今後と言う事にしたいと思います。