NakajiJapan

餓鬼の超弩級日記


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

勉強がてら構築してみました。以前は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......07_28/2208

1 Comment »

Rails + Thinで構成してみる in Scientific Linux

さくらのVPSを借りることになったので早速Ruby+Rails+Thinで構築してみることにします。

「Thin」てどういうものかって勝手にまとめてみると軽量で高速なRails専用のWebサーバらしいです。

the Mongrel parser, the root of Mongrel speed and security
Event Machine, a network I/O library with extremely high scalability, performance and stability
Rack, a minimal interface between webservers and Ruby frameworks

RVMのインストール

# bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

設定情報を追加

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
# rvm  install 1.9.3
# rvm  install 1.9.2
# rvm --default use 1.9.3

RubyGemsのインストール

sudo /usr/local/rvm/bin/ruby setup.rb
gem update --system

Mysqlのインストール

gem install mysql2

これの前提条件として

yum install mysql mysql-server mysql-devel

が必要になる。

Thinのインストール:Ruby専用サーバ

gem install execjs
gem install therubyracer
gem install thin

これでブラウザで画面がみれるようになれば完成です。しかし、Thinとは別にまたUnicornらしきものがでていることを知ったので勉強がてらいれてみることにします。それは後ほど。

■リファレンス
http://www.ruby-lang.org/ja/
http://rubygems.org/
http://beginrescueend.com/
http://code.macournoyer.com/thin/

No Comments »