Rails3のアプリケーションをnginx+unicorn上で動かすメモ

2013年5月27日

Railsをnginxとunicornで動かすと速いというウワサを耳にしたので,さっそくやってみることに.

unicornはgemで配布されてるのでインストールは簡単.

$ gem install unicorn

unicornの設定ファイルを,config/unicorn.rbとして新しく作成する.

# -*- coding: utf-8 -*-
# ワーカーの数
worker_processes 2

# ソケット
listen  '/tmp/unicorn.sock'
pid     '/tmp/unicorn.pid'

# ログ
log = '/var/log/rails/unicorn.log'
stderr_path File.expand_path('log/unicorn.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
   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

unicornの起動は,bundle exec unicornまたはunicorn_railsというコマンドを用いる.ポート番号はnginxとかapacheですでに使ってしまっている80などを回避して,WEBrickのデフォルトで使ってた3000あたりを適当に利用する.

$ bundle exec unicorn --config-file config/unicorn.rb --listen 127.0.0.1:3000 --env development

これでunicorn側は大丈夫だが,毎度起動するためにこれを打つのは怠いので,ここ(Nginx+Unicorn)のように起動スクリプトを作っておくと便利そう.

nginxの設定はApacheと共存させるためにやったリバースプロキシの設定とほぼ同じようにすればよい.

    upstream rails-unicorn {
        server unix:/tmp/unicorn.sock;
    }
    server {
        listen 80;
        server_name localhost;

        client_max_body_size 4G;
        root /path_to_app/public;

        # Reverse proxy setting for Ruby on Rails 3.2
        location / {
            proxy_pass http://rails-unicorn;
            proxy_redirect off;

            proxy_cache cache1;
            proxy_cache_key $scheme$proxy_host$uri$is_args$args;
            proxy_cache_valid  200 1d;
        }
        location ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ {
            #gzip_static on;
            expires     max;
            add_header  Cache-Control public;
        }

        error_page 500 502 503 504 /500.xml;
        location = /500.xml {
            root /path_to_app/public;
        }
    }

あとはlocalhost:3000にアクセスして動作するか確認.

参考:
ubuntuでnginx + unicorn – 設定編
Rails3アプリをnginx+unicornで動かしたら速すぎた
Rails3.2.8環境構築(Nginx+Unicorn)
花見の季節にさくらVPS: Nginx+Unicorn+Rails+Capistrano