nginx + starman + MT5.2な環境を作ってみた

nginx_starman_mt5.jpg

まだまだ情報少ないよ!でもできたよ。

MovableTypeは5.2になってから正式にpsgiに対応、Nginx対応を謳ってます。Nginxはシングルプロセスなアーキテクチャの利点から、巷ではapache2のリバースプロキシに使って静的コンテンツのリクエストを捌かせるような利用方法が主流のようです(既存環境にチョイ足しで効果絶大、トラフィックがそれなりにあるサイトでは有用だと思います)。

でもせっかく静的生成が得意なMTと組み合わせるなら、apache2完全カットして静的コンテンツを直接nginxから配信したらクールじゃね?と思ってしまうのが情というものです。調べてみるとapache2引き続き利用前提の解説が多かったので、apache2カットの方向でやってみる。

(作業後のうろ覚えで書いてるのでところどころ間違ってるかも...。お試しになる場合はご注意くらはい。)

環境の準備

私Ubuntu野郎なのでこんな環境&ポリシー。

  • Ubuntu 12.04 on さくらVPS 1G
  • ソース取ってくるとか面倒いから滅多にやらない(ruby2.x系が欲しいとかの場合は別です、aptに無いし)
  • MTのバージョンは5.2.3(個人無償ライセンス)
  • MTのインストールパスは/mt/を想定

まずは必要なもの入れてみる。

sudo apt-get update
sudo apt-get install nginx
cpanm Task::Plack
cpanm XMLRPC::Transport::HTTP::Plack
sudo apt-get install supervisor

これでオッケー(・ω<)★

設定

starmanでmt.psgiが起動できるか試してみる。

cd /path/to/mt
plackup mt.psgi

特にエラー無く起動していればOK(たぶん)。

次にsupervisorでmt.psgiをデーモン化する設定をする。conf.dの中にstarman用のconfファイルを設置した。

mkdir /home/hoge/psgi
sudo nano /etc/supervisor/conf.d/starman.conf
[program:mt]
user=hoge
command=/home/hoge/mt.run
autostart=true
autorestart=true
stopsignal=QUIT
log_stdout=true
log_stderr=true
logfile=/home/hoge/psgi/psgi.log

↑ここでは自分のhomeディレクトリに起動用シェルスクリプトを置く形にした。ログもhomeに置いちゃってるけど適宜お好みで変更するのがよい。

次にpidの保存先ディレクトリを作りつつ起動用シェルスクリプトを書く。

mkdir /path/to/mt/psgi
nano /home/hoge/mt.run
#!/bin/sh
ROOT=/path/to/htdocs_parent
MTDIR=$ROOT/htdocs/mt
PID=$MTDIR/psgi/mt.pid
PSGI=./mt.psgi
cd $MTDIR
/usr/local/bin/starman -l 127.0.0.1:5000 --pid $PID $PSGI

ここまでできたらmt.runを実行してみる。

sh mt.run

plackupコマンド叩いたときと同様、エラーが出なければOK。出てたら各種パーミッションいじってみる(特にlogとかpid保存先とか)。
問題なければ一旦終了。

次にnginxを設定する。

nano /etc/nginx/nginx.conf
events {
        worker_connections 1024;
        # multi_accept on;
}
http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        ##
        # nginx-naxsi config
        ##

        #include /etc/nginx/naxsi_core.rules;

        ##
        # nginx-passenger config
        ##

        #passenger_root /usr;
        #passenger_ruby /usr/bin/ruby;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

        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;
}

ざっくりこんな感じで。特に精査しておらず、動けばよろしいという感じ。

次にバーチャルホストの設定。
Ubuntuでapache2に慣れた人にはお馴染みのあのディレクトリがあり、今回は使ってみた。

nano /etc/nginx/sites-available/example.com
upstream mt{
        server 127.0.0.1:5000;
}

server {
        listen 80;
        server_name www.example.com;
        rewrite ^/(.*) http://example.com/$1 permanent;
}

server {
        listen 80;
        root /path/to/htdocs;
        index index.html index.htm;

        server_name example.com;

        #ssi on;
        #client_max_body_size 20M;

        access_log /path/to/logs/access.log;
        error_log /path/to/logs/error.log;

        location / {
                try_files $uri $uri/ /index.html;
        }

        location /mt/ {
                proxy_pass http://127.0.0.1:5000;
        }

        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/www;
        }
}

sites-available、sites-enableはあるけどa2ensiteに相当するコマンドがないっぽい(代替えスクリプト作ってる人はいる)ので、手動でリンクファイル作る。

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enable/example.com
service nginx reload

ここまで出来たらapache2を止めてnginxを再起動してみる。

service apache2 stop
service nginx restart

うまく動けば成功。
尚、mtの管理画面にアクセスする場合は
http://example.com/mt/
ではアクセスできない。
http://example.com/mt/mt.cgi
とフルパス打つこと。(最後の最後でハマったのは内緒)