さくらのVPS+Apache+PSGIサーバーでMT5.2のmt.psgiを動かす(環境構築編)

公開

現在ベータテストが行われているMovable Type 5.2の新機能の一つに「nginx+PSGIによる運用対応」があります。スカイアークシステム様のブログ記事を見ると、PSGIで運用した場合はCGIの約1.9倍速いとのことで、MTユーザーには大変興味深い内容ではないかと思います。正式リリースされた際には当サイトでもPSGIによる運用を行うべく、環境構築を行いました。

実際に作業を行う前に、先人の方のブログを参照したり、MacBook ProのVMware Fusionにテスト環境を作成してテストを行ったのですが、予想より苦労したこともあり、簡単に作業内容を記録しておきたいと思います。サーバーは「さくらのVPS v3 1G」で、OSはCent OS 6.x、WebサーバーはApache 2.x.x(最新)で運用しています。特別変わったものは入れておりません。

作業に当たっては、sudo su -でrootにログインして進めました。

Plack/PSGI関連モジュールのインストール

PSGIでmt.psgiを動作させるには、通常MTで必要なPerlモジュールに加え、Plack/PSGI関連モジュールのインストールが必要となります。yumでは無理そうでしたので、今回はcpanmを利用してインストールすることにしました。
モジュールインストール後のmt-check.cgiの様子

  • 実はVPS構築時にはcpanmではなくrpmforgeリポジトリを利用してyumでperlモジュールを揃えた経緯があります。今回cpanmを利用しても良いのか迷いましたが、テスト環境では問題が発生しませんでしたので、とりあえず進めることにしました。

事前準備

VPSでは必要なかったのですが、テスト環境ではyumで次のものをインストールしました。不足している場合は、cpanmでモジュールをインストールする際にエラーが発生します(インストールは進みますが、色々メッセージが出ます)。

  • gcc
  • expat-devel
  • VPSにperl-CPANを入れたのですが、必要か否かテスト環境でのテスト結果の記憶が曖昧になってしまいました...。

cpanmの準備

@OMAKASE様の「perlモジュールのinstallにcpanmを使う」を参考にしました。install方法〜cpanm自信のupgradeの項に従って進めればOKです。

モジュールのインストール

MTのドキュメント「Ja dev bootstrap mt psgi」の必要要件でも紹介されているとおり、次のようにTask::Plackで必要なモジュールをまとめてインストールすることができます。

しかし、インストール後にmt-check.cgiを確認すると不足があったことと、実際に動かす段階でエラーが発生した(※)ので、実際には次のコードを実施したことになります。

# cpanm Task::Plack
# cpanm XMLRPC::Transport::HTTP::Plack
# cpanm CGI::Parse::PSGI
# cpanm CGI::Compile
  • plackupした際に次のようなエラーが発生しました。
    Error while loading mt.psgi: Can't locate CGI/Compile.pm in @INC (@INC contains: extlib lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/share/perl5/Plack/App/WrapCGI.pm line 7.
    

インストールが完了したら、mt-check.cgiを動かして結果を確認します(下記以外にもいくつかモジュールが必要です)。
モジュールインストール後のmt-check.cgiの様子

mt.psgiの起動(まずはplackupで)

次のコードで起動します。HTTP::Server::PSGI: Accepting connections at http://0:5000/と表示されれば、問題なく起動し待機状態になっています。

# cd /path/to/mt
# plackup mt.psgi

Apacheの設定

mt.psgiはPSGIサーバーで動作しているため、/cgi-bin/mt/(/cgi-bin/mt/にmt.cgi等を入れている場合)へのリクエストをPSGIサーバーへ振って処理させる必要があります。そこでリバースプロキシの設定します。

リバースプロキシについては以前Node.jsの記事にて紹介していますが、次の通りです。

  1. /etc/httpd/conf.d/vhosts.confに次のようにバーチャルホストの設定を行います。
    <VirtualHost xxx.xxx.xxx.xxx:80>
    	ServerName sub.yourdomain.net
    	DocumentRoot "/var/www/vhosts/yourdomain/subdomains/sub/html"
    	ProxyPass /cgi-bin/mt/ http://localhost:5000/cgi-bin/mt/
    	ProxyPassReverse /cgi-bin/mt/ http://localhost:5000/cgi-bin/mt/
    </VirtualHost>
  2. /etc/httpd/conf/httpd.confで次のモジュールを読み込むようにします。
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
  3. 設定完了後、Apacheを再起動します。

作業完了

以上でPSGI環境構築作業は完了です。今まで同様にMTの管理画面にアクセスしてみましょう。SSHの画面にはリクエストが表示され、ブラウザ上では今までよりも高速にMTの管理画面が表示されていることと思います。
MT管理画面にアクセスした様子

今後

序文にも書きましたが、MT5.2の正式リリース時に本導入の予定です。本導入の際は、plackupではなく公式ドキュメントで推奨されている推奨PSGIサーバ「Starman(/usr/local/bin/starman)」を利用して動作させる予定です。またデーモン化も必要でしょう。これらに関しては、後日改めてレポートしたいと思います。

追記(2012年9月30日)

MT5.2へのアップグレードとPSGIでの運用開始」にMT5.2正式版へのアップデートとPSGIのデーモン化・運用開始に関する記事を書きました。