MovableType 新版のベータ版がリリースされています。新バージョンの目玉はなんと言っても nginx + PSGI/Plack 環境に対応し、大幅な高速化が図られたことです。
Movable Type ベータ
http://www.movabletype.jp/beta/52/index.html
nginx – Wikipedia
http://ja.wikipedia.org/wiki/Nginx
PSGI/Plack – Perl Superglue for Web Frameworks and Web Servers
http://plackperl.org/
バージョンアップするに辺り、今まで Apache で運用してきた環境をそのまま生かすため、静的コンテンツは Apache で、動的コンテンツ(MovableType の .cgi)は Starman + PSGI/Plack で動かすことにします。PSGI/Plack 自体は Web サーバを選ばないのですが、MovableType 5.2 のドキュメントによると Starman がいいらしいです。
さらに nginx を Reverse Proxy として使うので、図に書くとこんな感じ。
nginx は外部からのアクセスを右から左へ流すだけです。どうせなら静的コンテンツも nginx で処理したいところですが、nginx も PSGI/Plack も初めてなのでこんな感じで勘弁。
実際の作業は以下のサイトを参考にさせていただきました。
MovableType 5.2β で nginx + PSGIを試す(Starman+Supervisorでデーモン化 – uzuki05のブログ
http://uzuki05.hateblo.jp/entry/2012/07/06/175950
MovableType 5.2b2 のインストール
では作業を開始します。まず、MovableType のアップデートですが、これはいつも通りで特に変更は必要ありません。
$ tar zxvf MT-5.2b2.tar.gz $ sudo cp -a MT-5.2b2/* /Library/WebServer/Documents/mt $ cd /Library/WebServer/Documents/mt $ sudo cp -a mt-static/* ../mt-static $ sudo rm mt-static
あとはブラウザから http://example.com/mt/mt.cgi へアクセスすると、移行ウィザードが開始しますので画面の指示に従うだけです。
FastCGI から CGI へ環境を戻す
今まで FastCGI を使っていた場合は CGI に一旦戻します。
$ cd /Library/WebServer/Documents/mt $ sudo rm -f *fcgi $ vim mt-config.cgi
# 設定をコメントアウト #AdminScript mt.fcgi #CommentScript mt-comments.fcgi #TrackbackScript mt-tb.fcgi #SearchScript mt-search.fcgi #XMLRPCScript mt-xmlrpc.fcgi
これで、今まで 〜.fcgi に行っていたアクセスが 〜.cgi に向かうようになります。
Plack その他のインストール
Plack を含め、5.2 になって依存モジュールが増えましたのでまとめてインストール。
$ cpanm -v Task::Plack $ cpanm -v CGI::Parse::PSGI $ cpanm -v Authen::SASL $ cpanm -v Net::SMTP::SSL $ cpanm -v Net::SMTP::TLS $ cpanm -v XMLRPC::Transport::HTTP::Plack
この辺で Apache を再起動して、動作に問題ないことを確認しておきます。
$ sudo /usr/sbin/apachectl graceful
Apache の設定
今まで 80 番ポートで動いていた Apache を 10080 番で動作するようにします。
# Listen 80 # before Listen 10080 # after # <VirtualHost *:80> # before <VirtualHost *:10080> # after
Starman の設定
Starman は cpanm -v Task::Plack をやったときに一緒にインストールされているはずです。もし入っていなければ、cpanm -v Starman でインストールできます。
Starman によるサーバの起動スクリプトを書きます。
#!/bin/sh MT=/Library/WebServer/Documents/mt PID=$MT/pids/mt.pid PSGI=$MT/mt.psgi cd $MT /usr/local/bin/starman -l 127.0.0.1:18520 --pid $PID $PSGI
pid ファイルについての情報を mt-config.cgi に追記します。
PIDFilePath /Library/WebServer/Documents/mt/pids/mt.pid
pid ファイルを置くディレクトリを作ります。
$ cd /Library/WebServer/Documents/mt $ sudo mkdir pids
Starman を launchd で管理する
参考に上げた記事では Supervisor を使ってプロセスを自動起動するようにしています。これは Mac OS X でも使えるんですが、どうせなら OS 標準の launchd を使って管理してみましょう。
Mac OSにおける、initや/etc/rcやcronの代わりであるlaunchdの使い方 – kanonjiの日記
http://d.hatena.ne.jp/kanonji/20100621/1277075926
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>delphinus.mt-run</string>
<key>ProgramArguments</key>
<array>
<string>/Library/WebServer/Documents/mt/mt.run</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
設定できたら起動してみましょう。
$ sudo launchctl load /Library/LaunchDaemons/delphinus.mt-run.plist $ curl -L http://127.0.0.1:18520/mt/mt.cgi # ログイン画面の HTML が表示されたら成功
nginx のインストール
Homebrew でインストールし、設定ファイルを編集します。
$ brew -v install nginx
user _www;
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream apache {
server 127.0.0.1:10080;
}
upstream mt {
server 127.0.0.1:18520;
}
gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
server {
listen 80;
server_name remora.cx;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /mt/ {
proxy_pass http://mt;
break;
}
location / {
proxy_pass http://apache;
break;
}
}
server {
listen 80;
server_name blog.delphinus.dev;
access_log /var/log/nginx/blog-access.log;
error_log /var/log/nginx/blog-error.log;
location /mt/ {
proxy_pass http://mt;
break;
}
location / {
proxy_pass http://apache;
break;
}
}
}
デフォルトで数百行に及ぶ Apache に比べるとものすごくシンプルですね。設定ファイルについて何も知らなくても、何となくやってることがわかってしまいます。
設定が終わったら、launchd を使って起動するように設定します。(ファイルをコピーするだけです。)
$ sudo cp /usr/local/Cellar/nginx/1.2.2/homebrew.mxcl.nginx.plist /Library/LaunchDaemons/ # 試しに起動してみる $ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
起動!
準備は全て終わりましたので、一気に切り替えましょう。
# Apache の再起動 $ sudo /usr/sbin/apachectl graceful # 念のため Starman も $ sudo launchctl unload /Library/LaunchDaemons/delphinus.mt-run.plist $ sudo launchctl load /Library/LaunchDaemons/delphinus.mt-run.plist # 最後に nginx $ sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist $ sudo pkill nginx # なぜか自動的に終了しないので自分で kill $ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
まとめ
これで完了……なわけですが、実は別のトラブルからこのあとも修正が必要でした。それはまた別の記事に書きます。
mt/plugins/化にある CGI が機能しない(一応、解決)- DynamicMTML がこける(解決済み)
- Apache のアクセスログの IP アドレスが全部
127.0.0.1になる(解決済み)launchctl unloadで nginx が終了しない
それはそれとして、たしかにこれは価値あるアップデートです。元が FastCGI 環境だったので圧倒的というわけではないですが、通常の CGI 環境と比べると非常にスムーズに動いてくれます。これを体験すると、もう前のバージョンには戻れないほどです。今から正式版が待ち遠しいですね。

Pingback: MovableType5.2.3をPSGIで動かしてみた | IT Office Nishimiyahara