読者です 読者をやめる 読者になる 読者になる

ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

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`

です。