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