PSGI Plack 環境で Movable Type を動かす
PSGI/Plack について
PSGI とは、Perl Web Server Gateway Interface の略で、Perl で書かれたウェブアプリケーションのサーバーレイヤーを抽象化する為の仕様です。Python の WSGI や Ruby の Rack に相当します。PSGI に対応したアプリケーションは、PSGI サーバーと呼ばれる PSGI に準拠したウェブアプリケーションサーバー上で動作します。
PSGI サーバーには簡易的な Web サーバ機能しか実装されていない事が多いので、実際の運用に際しては別途 Web サーバを用意することをおすすめします。nginx や Apache など PSGI サーバーにリバースプロキシ出来る機能を備えている Web サーバーであれば、特に制限無く利用する事ができます。
Movable Type では、Starman を PSGI サーバーとして利用する事を想定しています。もちろん、Starman 以外の PreFork 型の PSGI サーバーや、PSGI を利用せず、CGI として Apache などの Web サーバーで運用することも引き続きできます。
Plack のインストール
Plack のインストールには、 Task::Plack を利用すると、関連するモジュールが一括してインストールされるので、簡単でおすすめです。
cpanm Task::Plack cpanm XMLRPC::Transport::HTTP::Plack
あるいは
cpan Task::Plack cpan XMLRPC::Transport::HTTP::Plack
必要な設定
PIDFilePath 環境変数
以下の様なアプリケーション全体の動作に関わるような設定変更を行った場合、永続化されたアプリケーションの再起動を試みます。
- インストール/アップグレードの完了時
- デバッグモードなどシステム設定の変更
- カスタムフィールドの追加/削除
実際には、上記作業が発生した時に、MT が環境変数 PIDFilePath で指定されたファイルに記述されているプロセス ID に対して SIGHUP を送出します。この動作を実現するため、PSGI サーバーで pid の指定を行って保存先を指定し、かつ、 mt-config.cgi にも同ファイルへのパスを追記してください。
# Append PIDFilePath to mt-config.cgi PIDFilePath /var/run/mt.pid
# then run starman $ starman -I${MT_HOME}/extlib --pid /var/run/mt.pid ./mt.psgi
推奨される起動オプション
-I${MT_HOME}/extlib
Movable Type の依存する cpan モジュールのうち、Perl のみで書かれた一部のモジュールは ${MT_HOME}/extlib に含まれています。-I オプションを指定しない場合、starman で読み込まれるモジュールに関しては、extlib ではなくサーバーにインストールされているバージョンを優先して読み込む形となり、Movable Type の想定しているバージョンとずれてしまうことがあります。そういった問題を防ぐために、starman には -I オプションを付けて起動することが推奨されています。
注意事項・制限事項
内部 HTTP リクエストでのデッドロック
plackup コマンドで起動される Web サーバーはリクエストを順次処理するシンプルな実装であるため、例えば自身の記事に対してトラックバックを送信した場合などのときにデッドロックが発生します。
- 送信側のプログラムコードでは、トラックバックのリクエストに対するレスポンスが帰ってくるまで処理がブロッキングされる
- (同一スレッドで処理待ちとなる)トラックバック受信側は、送信側の処理が完了するまで、リクエストの処理が開始されない
現在のところ、この問題に対処する予定はありません。また、トラックバック以外の機能でも同様の問題が発生する可能性は考えられます。本番環境では、prefork 型など、並列処理が可能な PSGI サーバの利用を推奨します。