rails+unicorn+nginxで環境構築


yumをアップデート

yum -y update

必要なもろもろをインストール

yum install -y curl-devel sqlite-devel libyaml-devel
yum install -y nodejs
gem install bundler rails

nginxをインストール

yum install -y nginx

unicornをインストール

gem install unicorn

ここではrails_appが以下にあるものとします。

/usr/share/nginx/html/rails_app

unicorn.rbを編集

config/unicorn.rb
# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)
timeout 15
preload_app true  # 更新時ダウンタイム無し

listen "/tmp/sockets/unicorn.sock"
pid "/tmp/sockets/unicorn.pid"

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])

上記のようにするとログはプロダクション環境の場合

tail -f /usr/share/nginx/html/rails_app/log/production.log

で見ることができます。

Nginxの設定ファイルを編集

vi /etc/nginx/conf.d/default.conf

もしtmp配下にsocketsフォルダがないときには

mkdir /tmp/sockets

で作成

default.conf
upstream app {
    # unicorn.rbで設定したもの
    server unix:/tmp/sockets/unicorn.sock fail_timeout=0;
}

server {


    listen 80;
    server_name localhost;

    # rails_appの場所
    root /usr/share/nginx/html/rails_app/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}  

Nginxを再起動

service nginx restart

unicornをスタートさせる

unicorn_rails -c config/unicorn.rb -E production -D

ブラウザ上で動作確認

http://your_ip_address/whatever

起動中のunicornを確認

ps aux | grep unicorn

起動中のunicornをkill

kill -QUIT `cat /tmp/sockets/unicorn.pid`