「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
