Sep 21, 2007

FastCGI環境で MT4を使うなら MT-Dispatchを使うといいよ

前振り。FastCGIプロセスのリサイクリングを目的としてFastCGIスクリプトファイルをtouchするというプラグインがある。

TouchMe (Junnama Online (Mirror))

相手はJunnamaさんだということで安心して忌憚のないところ言えば、美しくない。ファイルにtouchしたらリロードするというのは特定のFastCGI実装が備えている機能でしかない。もちろんそのことを承知の上で、限られた条件下で機能するツールを作ったのだろう。だよね?


さて本題。この記事ではまずMovable TypeのデフォルトのFastCGIサポートは使いものにならないことを言明しておきたい。なぜなら、LaunchBackgroundTasksが使えないからである。この欠陥はあまり広く認識されていないようにも見える。これに比べればプロセスリサイクリングの手段が(コマンドラインで行う以外に)存在しないというのは瑣末事なのに、である。この記事の目的はこの問題を周知せしめることと、より良い方法を紹介することである。ここで紹介する方法は、TouchMeが実現しようとしているFastCGIプロセスリサイクリングの「より優れた解」にもなっている(これが前振りの理由)。

まず、LaunchBackgroundTasksが使えるCGI環境と使えないFastCGI環境とを比較するならどちらを選ぶべきだろうか。速度の点で後者を選ぶべきだろうか。私なら迷わず前者を選ぶ。

なぜかと言えば、後者の方がタイムアウトしやすいからだ。例えば、トラックバックの一覧画面からスパムに分類されていないスパムトラックバックを200個ほどまとめて削除してみればよい。LaunchBackgroundTasksが使えない環境では、おそらくフロントエンドプロセス(つまり、画面レンダリングを行うのと同一のプロセス)で一度に大量のエントリーを再構築することになるはずである。それゆえ容易にタイムアウトを起こし得る。これに対してLaunchBackgroundTasksが使える環境では、エントリーの再構築はforkシステムコールで生成されたバックエンドプロセスで行われるので、フロントエンドプロセスがタイムアウトすることは...まずない。

プロセスの常駐化による高速化より、タイムアウトしないシステム(=正常に動作するシステム)の方が重要なのは明らかである。だから、Movable TypeのデフォルトのFastCGIやmod_perlサポートは使いものにならない。

ではどうすればよいかと言うとハックするしかない。私がMT 3.2から移行できないのも主にこの改造が原因なのだが、そうしたシガラミがないのであれば、Reed A. CartwrightのMT-Dispatchを使うのが現状最も簡便で効果的な「ハック」である。

De Rerum Natura: MT-Dispatch

日本語で解説された文書が見当たらないところを見ると比較的マイナーなのだと思う。MT-Dispatchを使うと、FastCGI環境でもLaunchBackgroundTasksが利用可能になる。また、MT4に対応したversion 1.4からはダッシュボードからすべてのMTインスタンスを再起動できるようになっており、プラグインの脱着やmt-config.cgiの設定変更などの反映を簡便に行える。

以下は、Apache 2.2 + mod_fcgid 2.1での設定方法について簡単に説明&自分用のメモ。

  1. FCGI, FCGI::ProcManager, Sub::Override, File::Slurpなど必要なPerlモジュールをインストールしておく。
  2. 上記リンクより入手できるMT-Dispatch-1.4.tar.gzをMT4のpluginsディレクトリに展開する。
    $ cd /PATH/TO/MT/plugins; tar xfz ~/MT-Dispatch-1.4.tar.gz
  3. mt.cgiなどの拡張子をfcgiにリネームする。
    $ mv mt.{,f}cgi
    $ mv mt-comments.{,f}cgi
    $ mv mt-tb.{,f}cgi
    
  4. mt-config.cgiに必要なディレクティブを追加する。
      AdminScript mt.fcgi
      CommentScript mt-comments.fcgi
      TrackbackScript mt-tb.fcgi
      
      LaunchBackgroundTasks 1
    
  5. Apacheのhttpd.confに以下のように追加する。
      LoadModule fcgid_module modules/mod_fcgid.so
      
      <IfModule mod_fcgid.c>
          # DefaultInitEnv MT_HOME /PATH/TO/MT/
          DefaultInitEnv PERL_FCGI_MAX_REQUESTS 250
          DefaultInitEnv PERL_FCGI_CHILDREN 4
          DefaultInitEnv PERL_FCGI_LOG /var/log/apache22/mt-dispatch.log
          <Directory "/PATH/TO/MT">
              AddHandler fcgid-script .fcgi
              Options ExecCGI
              allow from all
              FCGIWrapper /PATH/TO/MT/plugins/MT-Dispatch/mt-dispatch.fcgi .fcgi
          </Directory>
      </IfModule>
    
    MT_HOMEは設定する必要はない。複数のMT4を同一ドメインにインストールした場合には、インストール場所ごとにMT_HOMEが異なるはずなのでむしろ設定しない方がよい。PERL_FCGI_LOGはFastCGIプロセスから書き込み可能なファイルを指定すること。デフォルトでは/var/log/mt-dispatch.logに書き込むようになっていて嵌まるので要注意。
  6. apachectl restart。

こんな感じ。すでにFastCGI環境を使っている人なら特に滞りなく設定できるだろう。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com