MovableType 5.2b2 を nginx + PSGI/Plack @ Mountain Lion な環境で動かす


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 として使うので、図に書くとこんな感じ。

120825-0003.png

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

まとめ

これで完了……なわけですが、実は別のトラブルからこのあとも修正が必要でした。それはまた別の記事に書きます。

それはそれとして、たしかにこれは価値あるアップデートです。元が FastCGI 環境だったので圧倒的というわけではないですが、通常の CGI 環境と比べると非常にスムーズに動いてくれます。これを体験すると、もう前のバージョンには戻れないほどです。今から正式版が待ち遠しいですね。

One thought on “MovableType 5.2b2 を nginx + PSGI/Plack @ Mountain Lion な環境で動かす

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

コメントを残す