Hosting MT under FastCGI (Japanese)

From MovableType

Contents

FastCGI で Movable Type を動作させる

利点と概要

Movable Typeは多数のファイルから構成される比較的大きなアプリケーションです。CGIを利用していると、アプリケーションは*毎回メモリにロードしなおされる*ことになり、また複数のリクエストやセッションをまたがってキャッシュを活用することもできません。

mod_perl や FastCGI を使うと、アプリケーションは1度メモリにロードされ、その後のリクエストで毎回パースや解釈をする必要がなくなります。これによってパフォーマンスが劇的に向上します。

また、アクセスの多いサイトをスパム攻撃から守る効果もあります。MTのアプリケーションが(たとえば10から20のエントリーに対してスパムコメントが同時に投稿されている場合など)同時にいくつも起動させられると、サーバーは簡単に過負荷になってしまいます。MTをメモリ上に保持しておけば、コメント投稿もスムーズに行われるので、サーバーにかかる負荷が抑えられます(消極的な対策ではありますが)……。


FastCGI がインストール済みかどうかを確認する方法

セキュリティ上の理由でこれを公開していないシステムも多数あります。また、FastCGI を検出できるかどうかは実装にも依存します。いずれにしても、以下の方法を試してみるのは無駄ではないと思います。

    • ホストに問い合わせる**

もっとも確実な方法はホスティングプロバイダに問い合わせることです。多くのプロバイダがインストールされているApacheモジュールをヘルプやFAQなどのセクションで公開しています。

    • 試行錯誤してみる**

以下の内容の.htaccessという名前のファイルを作成して、MTのディレクトリに配置してみます。

   <IfModule fastcgi_module>
   FastCgiIpcDir /tmp/fcgi_ipc/
   AddHandler fastcgi-script fcgi
   FastCGIConfig -autoUpdate -idle-timeout 120 -killInterval 3600 -maxClassProcesses 6 -maxProcesses 15
   </IfModule>
   <IfModule fcgid_module>
     <IfModule fastcgi_module>
     AddHandler fcgid-script fcg fcgi fpl
     </IfModule>
   IPCCommTimeout 60
   SocketPath run/fcgidsock
   </IfModule>

Note: <If*> はえてして冗長になりがちで、実際にはほぼ必要ないのですが、ここでは元のサンプルを活かしつつ、便宜上とりあえずこのように記述しておきました。

次に、何らかのCGIプログラムを含むファイルを、fcgi という拡張子で配置して、それが正しくロードされるかどうか見てみます。もしロードされれば、FastCGI はインストールされています。エラーが起きた場合はおそらくインストールされていません。

      • 確認済みホスト***

FastCGI をサポートするホストの情報は MTHostingDeveloperInfo を参考にしてください。

Movable Type 3.34 を FastCGI で動作させる方法

バージョン3.34から、Movable Typeには !FastCGI のサポートが**統合**されています。これによって、特殊なファイル、具体的には`MT::Bootstrap`のファイルを別途Movable Typeにインストールしなくても済みます。以下のように若干の変更を加えるだけで、FastCGIでMovable Typeが動作するようになります。

Movable Typeを!FastCGIで動作させるには、Movable Typeに付属のPerlモジュールに加えて、FCGIモジュールも必要になる場合があります。インストールされていない場合はあわせてインストールしてください。

Movable Typeの設定(自動)

すべてのCGIファイルを !FastCGI 環境下で動作させるように設定することができます。この場合、Movable Typeに手を入れる必要はありません。Webサーバーに対して「`.cgi`」拡張子が付いたすべてのファイルを FastCGI のハンドラで動作させるように指定するだけです。Apacheの mod_fastcgi ではこれは次のように記述します。

   #AddHandler cgi-script .cgi
   AddHandler fastcgi-script cgi

mod_fcgid では次のようになります。

   AddHandler fcgid-script cgi

こうすれば、Movable Typeは FastCGI で動作するようになります。しかし、これだとすべてのCGIアプリケーションに影響してしまいます。場合によってはMovable Typeだけを手動で構成したい場合もあるでしょう。その場合は、以下の解説に進んでください。

Movable Typeの設定(手動)

FastCGI のインストール

まずWebサーバーに !FastCGI の実装をインストールします。ホスティングプロバイダによってはユーザーがインストールすることは許可されていないかもしれません。詳細はプロバイダにお問い合わせください。

CGIファイルをコピーする

以下のCGIファイルをコピーして、ファイルの拡張子を.cgiから.fcgiに変更します。以降は便宜上 fcgi としていますが、これは必ずしも fcgi である必要はありません。

  • mt.cgiをmt.fcgiに
  • mt-comments.cgiをmt-comments.fcgiに
  • mt-tb.cgiをmt-tb.fcgiに
  • mt-view.cgiをmt-view.fcgiに
  • mt-search.cgiをmt-search.fcgiに

MTの構成ファイルを編集する

Movable Typeの構成ファイル(mt-config.cgi)を編集します。具体的には次の内容を追加します。

   AdminScript mt.fcgi
   CommentScript mt-comments.fcgi
   TrackbackScript mt-tb.fcgi
   SearchScript mt-search.fcgi
   ViewScript mt-view.fcgi

Movable Type 3.2 の mt-config.cgi や 3.1 以前の mt.cfg を引き継いで利用している場合は、# でコメントアウトされている次のセクションを前の例にならって書き換えます。

   # AdminScript mt.pl
   # CommentScript mt-comments.pl
   # TrackbackScript mt-tb.pl
   # SearchScript mt-search.pl
   # ViewScript mt-view.pl

また、LaunchBackgroundTasks を無効にする必要があります。

ほかの設定例

このようにファイルのリネームや Movable Type の構成ファイル ( mt-config.cgi ) の設定を必要とせず、さらにほかの CGI アプリケーションに影響を与えないで MT のみを FastCGI で動作させます。

mod_fcgid

   <Directory /var/www/path-to-mt-home>
       AllowOverride None
       Options ExecCGI
       Order allow,deny
       Allow from all
   <FilesMatch "^mt(?:-(?:comments|search|tb|view))?\.cgi$">
       SetHandler fcgid-script
   </FilesMatch>
   </Directory>
   IPCCommTimeout 60
   SocketPath path-to-fcgidsock

mod_fastcgi

   <Directory /var/www/cgi-bin/mt>
       AllowOverride None
       Options None
       Order allow,deny
       Allow from all
   <FilesMatch "^mt(?:-(?:comments|search|tb|view))?\.cgi$">
       SetHandler fastcgi-script
   </FilesMatch>
   </Directory>
   FastCgiIpcDir /etc/httpd/fastcgi
   FastCgiConfig -autoUpdate -idle-timeout 120 -killInterval 3600 -maxClassProcesse
   FastCgiServer /var/www/cgi-bin/mt/mt.cgi
   FastCgiServer /var/www/cgi-bin/mt/mt-search.cgi
   FastCgiServer /var/www/cgi-bin/mt/mt-view.cgi
   FastCgiServer /var/www/cgi-bin/mt/mt-tb.cgi
   FastCgiServer /var/www/cgi-bin/mt/mt-comments.cgi