rails4 + unicorn + nginx


rails

基本的にはhttp://qiita.com/a_ishidaaa/items/74de8bdaecd637063c40 と同様に、production環境を準備する。一点、config/enviroments/production.rbのアセットの提供設定はfalseにする。nginxがやってくれる。

config/enviroments/production.rb
# Disable Rails's static asset server (Apache or nginx will already do this).
  config.serve_static_assets = false  

unicorn

インストール

Gemfileにunicornを追記

Gemfile

gem 'unicorn'

bundle install を実施

$bundle install

設定ファイル作成

config/unicorn.rbに設定を追記

config/unicorn.rb

@app_path = '/home/rails/rails/test/json_server'

worker_processes 2
working_directory "#{@app_path}/"
preload_app true
timeout 30
listen "/tmp/unicorn.sock", :backlog => 64
pid "/tmp/unicorn.pid"
stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"

  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
  sleep 1
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

unicornプロセス起動

$JSON_SERVER_DATABASE_PASSWORD=password bundle exec unicorn_rails -c config/unicorn.rb -E production -D

nginx

インストール

sudo yum install nginx

設定ファイル作成

/etc/nginx/conf.d/myapp.confにnginx用のコンフィグ追記

etc/nginx/conf.d/myapp.conf

upstream unicorn_server {
    # This is the socket we configured in unicorn.rb
    server unix:/tmp/unicorn.sock
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name _;

    keepalive_timeout 5;

    root /home/rails/rails/test/json_server/public;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        # If you don't find the filename in the static files
        # Then request it from the unicorn server
        if (!-f $request_filename) {
            proxy_pass http://unicorn_server;
            break;
        }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /home/rails/rails/test/json_server/public;
    }
}


nginxの起動

$sudo /etc/rc.d/init.d/nginx start