ユーザ用ツール

サイト用ツール


ruby:unicorn

Unicorn

Rack対応のWebアプリケーションを実行するサーバ。

File: README Unicorn: Rack HTTP server for fast clients and Unix

インストール

gemでインストールできる

$ gem install unicorn

起動

railsのrootディレクトリに移動して以下のコマンドで起動

$ unicorn -l 3000

rails 2系の場合は

$ unicorn_rails -l 3000

nginxをリバースプロキシにする

unicorn本番用のコンフィグ(${RAILS_ROOT}/config/unicorn.rb)を作成。

# folkする子プロセスの数、nginxのワーカーとだいたい同じ程度に
worker_processes 8
 
# railsのルートを指定
working_directory '/var/lib/some_rails_app'
 
# nginxとドメインソケットで通信する合はパスを、TCP通信する場合はポート番号を指定
listen '/var/lib/some_rails_app/tmp/sockets/unicorn.sock'
 
stderr_path '/var/log/unicorn.err.log'
stdout_path '/var/log/unicorn.out.log'
 
preload_app true
 
before_fork do |server, worker|
  ActiveRecord::Base.connection.disconnect!
end
 
after_fork do |server, worker|
  ActiveRecord::Base.establish_connection
end

nginx.confを修正

{code}
http {
    server {
        listen       80;
        server_name  localhost;
        ...
    }
    ...

    upstream backend {
        # unicorn.confで指定したドメインソケットのパスを指定
        server unix:/var/lib/some_rails_app/tmp/sockets/unicorn.sock;
    }

    server {
        listen 80;
        server_name rails.example.com;

        # rootには $RAILS_ROOT/public を指定
        root /usr/local/redmine/current/public;

        # public以下の静的ファイルはそのままnginxが返す
        # 静的ファイルが無ければunicornに投げる
        try_files $uri @unicorn;

        location @unicorn {
            proxy_set_header HOST $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_redirect off;
            # リクエストを upstream backend に投げる
            proxy_pass http://backend;
        }
    }
    # ここまで追加
    ...
}

nginxを起動

$ sudo service nginx start

unicornをデーモンモードで起動

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

デーモン起動したunicornを停止

$  kill -QUIT pid

デーモン起動したunicornを強制終了

$  kill -TERM pid

起動スクリプト

適当に作成、以下はunicorn + redmineの例

#!/bin/bash

UNICORN_BIN=/usr/bin/unicorn_rails
RAILS_ROOT=/usr/local/redmine/current
PID_FILE=$RAILS_ROOT/tmp/pid/unicorn.pid
THIS_FILE=/etc/init.d/redmine

cd $RAILS_ROOT || echo >&2 "could not move redmine directory."; exit 1

check_pid() {
  test -s $PID || echo >&2 "NOT FOUND PID FILE"; exit 1
}

case "$1" in
  start)
    $UNICORN_BIN -c config/unicorn.rb -D
    ;;
  stop)
    check_pid && kill -QUIT `cat $PID_FILE`
    ;;
  force-stop)
    check_pid && kill -TERM `cat $PID_FILE`
    ;;
  restart)
    $UNICORN_BIN -c config/unicorn.rb -D
    check_pid && kill -QUIT `cat $PID_FILE`
    ;;
  *)
    echo "Usage: $THIS_FILE {start|stop|restart|force-stop} "
    exit 1
    ;;
esac
ruby/unicorn.txt · 最終更新: 2013/06/07 06:05 by nullpon