nginxとunicornを連携させてrailsを動かす

nginx

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP proxy server

nginx(エンジンエックス)はHTTPサーバ、リバースプロキシサーバ、メールプロキシサーバ、そして汎用的なTCPプロキシサーバである

HTTPサーバに加えて、様々な代理サーバ(プロキシサーバ)的な役割もこなせますよ。といった感じ?

導入は容易です。ubuntuの場合、apt-get install nginxのコマンドをたたくだけで終了です。ブラウザ上からアクセスして「Welcome to nginx!」と表示されていればOKです。確認方法としてtail -f /var/log/nginx/access.logコマンドをたたいてからアクセスすると、nginx経由でアクセスできていることが確認できます。

unicorn

Unicorn is an HTTP server for Rack applications designed to only serve fast clients on low-latency, high-bandwidth connections and take advantage of features in Unix/Unix-like kernels. Slow clients should only be served by placing a reverse proxy capable of fully buffering both the the request and response in between Unicorn and slow clients.

unicornはrackアプリケーション用に設計されたHTTPサーバで、遅延の少なくコネクションの良い(?)サービスを提供し、そしてUnixUnixライクな機能を活用する。低速なクライアントはunicornとの間に要求と応答をバッファリングできるリバースプロキシを置く必要がある。

こんな感じか。分からん

こちらも導入は容易。Gemfileにgem 'unicorn'と書いてbundle installするだけです。導入後、rails sではなくunicornとコマンドを叩くと8080ポートでアプリが起動します。

連携

unicornのgithubにnginxとunicornの設定のexampleファイルとしてnginx.confunicorn.conf.minimal.rbというファイルがあります。これらのファイルを修正してnginxとunicornを連携させてrailsアプリを動かすことを目標とします。(unicornの設定ファイルに関してはunicorn.conf.rbというものもあったのですが、「とりあえず動かす」という目的から見るといじることが少なそうなminimalのほうが適切かと思いそちらを採用しました。)diffの雰囲気はこんな感じです。(homeディレクトリにtest_appというrailsアプリを作ったという想定です。一部おかしいところがあるかもしれないのであくまで雰囲気を感じ取っていただければと思います。)

各設定ファイルの置き場所ですがnginxは/etc/nginx配下(nginxのデフォルト)に、unicornrailsのconfigディレクトリ配下にそれぞれ配置しました。

diffを見ていただければわかると思うのですが、基本的にpath/to/hogehogeとなっているところを実際の値に書き換えていく作業でした。しかし以下の2点にハマりました。

1,unicorn.rbのlistenに何を指定するか

unicorn.rbのsocketパスとnginx.confのserver unix:pathを統一することで、unicornとnginxの連携が可能になるようです。

# unicorn.rb
listen '/home/doala/test_app/tmp/sockets/.unicorn.sock'

# nginx.conf
server unix:/home/doala/test_app/tmp/sockets/.unicorn.sock fail_timeout=0;

参考:http://prototype-beta.com/server/entry/12_ubuntu%E3%81%A7nginx_+_unicorn_-_%E8%A8%AD%E5%AE%9A%E7%B7%A8

2,[warn] duplicate MIME type "text/html"

nginxの再起動時(だったと思います)に上記のような警告が出ました。今ひとつ分かっていませんが"text/html"はデフォルトでgzipに変換されているらしいため、confファイルに記述しなくていいらしいです。

# config/nginx.conf
gzip_types text/plain text/html text/xml text/css # 修正前
gzip_types text/plain text/xml text/css # 修正後

参考:http://www.laddy.info/2012/08/26076/

unicorn -c config/unicorn.rbのようにcオプションで設定ファイルを指定して(unicorn.conf.minimal.rbからリネームしています)unicornを起動するとブラウザ上からrailsアプリが動いていることを確認できました。とりあえず目標は達成。