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サーバで、遅延の少なくコネクションの良い(?)サービスを提供し、そしてUnixやUnixライクな機能を活用する。低速なクライアントはunicornとの間に要求と応答をバッファリングできるリバースプロキシを置く必要がある。
こんな感じか。分からん
こちらも導入は容易。Gemfileにgem 'unicorn'
と書いてbundle install
するだけです。導入後、rails s
ではなくunicorn
とコマンドを叩くと8080ポートでアプリが起動します。
連携
unicornのgithubにnginxとunicornの設定のexampleファイルとしてnginx.confとunicorn.conf.minimal.rbというファイルがあります。これらのファイルを修正してnginxとunicornを連携させてrailsアプリを動かすことを目標とします。(unicornの設定ファイルに関してはunicorn.conf.rbというものもあったのですが、「とりあえず動かす」という目的から見るといじることが少なそうなminimalのほうが適切かと思いそちらを採用しました。)diffの雰囲気はこんな感じです。(homeディレクトリにtest_appというrailsアプリを作ったという想定です。一部おかしいところがあるかもしれないのであくまで雰囲気を感じ取っていただければと思います。)
各設定ファイルの置き場所ですがnginxは/etc/nginx
配下(nginxのデフォルト)に、unicornはrailsの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;
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アプリが動いていることを確認できました。とりあえず目標は達成。