「Unicorn + Rails + Nginx」で構築してみる

( Rails )

勉強がてら構築してみました。以前はrailsのWebサーバはThinで構築していたのですが、 最近流行している「Unicorn」、さらにはフロントにリバースプロキシとHTTP用のサーバ「nginx」 をおいて構築してみることにします。

仕組みについてはこちらのサイトがよくまとめられていたので概要つかむによいでしょう。

まずは、nginxのインストールを行います。インストールはあらかじめrpm をインストールしてからyumでインストールし直します。

rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install nginx

一度、デフォルトでnginxで起動するかどうかの確認を行います。「service nginx start」でhttp://hoge.moge にアクセスしてnginx用の画面が表示されていればとりあえずはインストール完了です。

以下、Unicornがnginx経由でアクセスできるようにするための設定ファイルになります。

upstream hoge.moge {
    server unix:/var/www/test/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name hoge.moge;

  root /var/www/test/public/;
  access_log log/access.log;
  error_log  log/error.log;

  location / {
    if (-f $request_filename) {
        break;
    }
    # ファイルが存在しなければunicornにproxyする
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://hoge.moge;
  }

  # この記述がないと静的ファイルが表示されなかった
  location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
    expires 1y;
  }
}

なんか書き方はPerlbalよりわかりやすいようなイメージしました。気のせいかもしれませんが。。。

次は、Unicornのインストールです。gemでパッケージをインストールします。

gem install unicorn

これでおしまい。

その後、Railsで展開されているコンフィグファイルに設定情報を記述します。

vi config/unicorn.conf
# -*- coding: utf-8 -*-
# ワーカーの数
worker_processes 2

# capistrano 用に RAILS_ROOT を指定
working_directory "/var/www/test/"

# ソケット
#listen '/tmp/unicorn_of_example.sock'
#listenFile = working_directory << 'tmp/sockets/unicorn.sock'
listen  '/var/www/test/tmp/sockets/unicorn.sock'

# ログ
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
            # 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

最後にそれぞれを起動します。

unicorn_rails -c config/unicorn.rb -E production -p 5000 -D
service nginx start

指定のURLからアクセスして画面がみれれば完成でし!

□参考URL http://nginx.org/ http://techracho.bpsinc.jp/bps/2010_07_28/2208