unix socket で nginx の後ろで thin (Rails) を動かす
ひょー、家のサーバ落ちたー。から hatena に書いておこう。
- > 復活したからこぴーした。 http://ecpplus.net/weblog/linux/thin_behind_nginx/
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`)