nginx の後ろで thin を unix socket で動かす

Railsを起動するとき、いつもPoundの後ろで複数ポートで振り分けっていうのをよくやっていたのだけど、unix socket で nginx の後ろで thin を動かすと早いらしいとのことで、試してみた。

環境はOSX

thinのインストール

$ sudo gem install thin
$ sudo gem install eventmachine --source http://code.macournoyer.com

2行目は、thinをsocket指定して動かす時に eventmachin の 0.11.0 以上が必要とのことで、OSXでデフォルトで入らなかったので入れた。

インストールはこれで完了。

nginxのインストール

Portで入るのが 0.5.1 ?とかで、ちょっと古かったので公式サイト(http://nginx.net/)から現時点で安定版の 0.6.31を取得してインストール

$ wget http://sysoev.ru/nginx/nginx-0.6.31.tar.gz
$ tar xvzf nginx-0.6.31
$ cd nginx-0.6.31
$ ./configure --prefix=/usr/local
$ make
# make install

で、無事インストールが終わるはず。configure で pcre チェックされてたので、 pcre とか入ってない場合はいれたほうがよさげ。VirtualHostの設定するときに使われるのかな?

nginxの設定

configure のオプションで –prefix=/usr/local とした場合、設定ファイルは /usr/local/conf/nginx.conf に生成されていて、デフォルトでこれを読みに行きます。

編集します。最低限の設定だけ。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    sendfile        on;
    keepalive_timeout  0;
 
    upstream backend {
        server unix:/tmp/thin.0.sock;
        server unix:/tmp/thin.1.sock;
        server unix:/tmp/thin.2.sock;
        server unix:/tmp/thin.3.sock;
    }
 
    server {
        listen       80;
        location / {
            proxy_pass http://backend;
 
        }
    }
}

これで、80番ポートにきたものを、unix socket の /tmp/thin.[0-3].sock で動いてる何かに転送出来るようになりました。

以下のように、-t をつけて設定ファイルの文法チェックをします。OKなら以下のようなメッセージが出ました。

$ sudo /usr/local/sbin/nginx -t
2008/06/25 01:05:12 [info] 14511#0: the configuration file /usr/local/conf/nginx.conf syntax is ok
2008/06/25 01:05:12 [info] 14511#0: the configuration file /usr/local/conf/nginx.conf was tested successfully

thinの設定(起動)

Rails でしか使ったことないので、以下 Rails アプリのディレクトリ直下で叩いてくだしあ。コマンドに引数渡すだけだけど、先ほど nginx.conf で指定した unix socket で動かす。

* s は サーバ4つで、–socket で /tmp/thin.sock とするとサーバの数だけ /tmp/thin.n.sock が出来るようだ。

$ thin start -s 4 --socket /tmp/thin.sock

nginxの起動

以下のコマンドで起動します。ぼくの環境だと、何も標準出力されずに起動しました。起動したら lsof -i:80 とかして80番で立ち上がってることを確認します。

$ sudo /usr/local/sbin/nginx

これで動いてるようだ。

この状態で、裏を切ってみる。Rails だと、thin の pid ファイルが tmp/pids/ 以下に出来ますんで、今 /tmp/thin.[0-2].sock で動いてるところを切ってみます。

$ kill cat `tmp/pids/thin.0.pid`
$ kill cat `tmp/pids/thin.1.pid`
$ kill cat `tmp/pids/thin.2.pid`

これで3だけが動いてる状態になりましたが、正常につながっているようです。ちゃんと振分けられてるみたいですねー。

Pound に比べていいなって思うところが、バックエンドが落ちたときの挙動です。Pound は Alive で指定した秒数でポーリングでバックエンドを死活監視をしてるみたいなので、後ろが落ちちゃったあと次のポーリングまではエラー画面が出てしまいます。

nginx で今回試してみた感じ、後ろが落ちても前にエラーが表示されることはないみたい?全部落ちると、もちろんエラー画面が出ますけど。

参考URL: http://wiki.codemongers.com/Main (nginx の wiki)

中国行ってるとき、家のサーバ落ちたら終わりかと(‘A`)

nginx の後ろで thin を unix socket で動かす