NginxとUnicornの連携設定
今時Railsアプリを動かすなら、UnicornとNginxの組み合わせって感じがします。
Nginxは今回初めてまともに触ったのですが、設定ファイルがApacheに比べてフレンドリーな感じがしました。
参考にしたところ
花見の季節にさくらVPS: Nginx+Unicorn+Rails+Capistrano - Qiita [キータ]
Unicornはここの設定をほぼ参考にしたものを仕様にあわせています。
やってること
簡単にいうと、Nginxをリバースプロキシにするといったところです。静的なコンテンツは直接Nginxから取りにいかせて、テンプレートなど動的な部分はUnicornに問い合わせるといった感じになります。
Nginxの設定
server { # リッスンするポート、サーバー名 listen 80; server_name server.name.co.jp; # プロジェクトルートの場所/publicにしておく root /path/to/rails/root/public; access_log logs/access.proxy.log deflate; error_log logs/error.proxy.log; include /usr/local/nginx/conf/conf.d/proxy.param; #.gitは無視 location ~ /(\.ht|\.git|\.svn) { deny all; } #assetsは直接返すように設定 location ~* \.(html|ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ { root /path/to/rails/root/public; expires 1d; add_header Cache-Control public; break; } location / { if (-f $request_filename) { break; } proxy_no_cache 1; proxy_cache_bypass 1; proxy_pass http://rails_unicorn; } location @unicorn_rails_app { proxy_pass http://rails_unicorn; } } upstream application-unicorn { # Unicornのソケットを指定: server unix:/tmp/unicorn_socket.sock fail_timeout=0; }
Unicornの設定
working_directory "/path/to/rails/root/" # ワーカーの数 worker_processes 4 # ソケット listen '/tmp/unicorn_socket.sock' listen 9080, :tcp_nopush => true # PID pid "/tmp/unicorn_app.pid" # 中身はプロセスID # ログ stderr_path File.expand_path('log/unicorn.err.log', ENV['RAILS_ROOT']) stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT']) # ダウンタイムをなくす preload_app true before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! old_pid = "#{ server.config[:pid] }.oldbin" unless old_pid == server.pid begin # SIGTTOU だと worker_processes が多いときおかしい気がする Process.kill :QUIT, File.read(old_pid).to_i rescue Errno::ENOENT, Errno::ESRCH end end end after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end
ざっとこんなかんじです。
手作業でデーモンとして起動するときは
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
止めるときは
kill -QUIT `cat /tmp/unicorn_app.pid`
です。