軸はこーしろーからいきますよ

基本的にただの忘備録

Nginx+unicorn+rails@ubuntu12.04の(最低限動く)環境構築

Ubuntu server 12.04にインストールしました.
要はNginxとUnicornの設定に関する話です.

Nginxのインストール

apt-getでインストールします.
公式より
/etc/apt/sources.list ファイルに以下を追記します.

deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx

そして,

$ sudo apt-get update
$ sudo apt-get install nginx

すると公開鍵を利用できない云々と言われるので公開鍵を登録します.

$ gpg --keyserver subkeys.pgp.net --recv-key 123456
$ gpg --export | sudo apt-key add -

"123456"は,"NO_PUBKEY 123456"とかエラーを返してきた時の123456の値を入れます.
そして再び

$ sudo apt-get install nginx

これでNginxがインストールできます.

Nginxの設定

/etc/nginx/nginx.conf を編集します.

user user_name;
worker_processes 2;
 
events {
        worker_connections 1024;
}
http {
        upstream backend {
                server unix:/path_to_rails_app/tmp/sockets/unicorn.sock;
        }

        server {
                listen 80;
                server_name localhost;

                root /path_to_rails_app/public;
                error_log /path_to_rails_app/log/error.log;

                location / {
                      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_redirect off;
                      if (!-f $request_filename) { proxy_pass http://backend; }
                }

                location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
                        expires 1y;
                        add_header Cache-Control public;

                        # http://guides.rubyonrails.org/asset_pipeline.html#server-configuration
                        # add_header Last-Modified "";
                        # add_header ETag "";
                        log_not_found off;
                }
        }
}

upstreamでunixソケットを指定します.
そのファイルを後述のunicornで指定することでNginxとunicornの連携がとれます.
そしてNginx再起動

$ sudo /etc/init.d/nginx restart

unicornのインストール

Gemfileに以下を追記.

gem 'unicorn'

そいでbundle installすればOKです.

unicornの設定

RAILS_ROOT/config/unicorn.rbとかして設定ファイルを作成します.
http://blog.livedoor.jp/sasata299/archives/51810645.htmlを参考にさせていただ
きました.

$RAILS_ROOT = "/path/to/rails/app"

worker_processes 2
working_directory "#{$RAILS_ROOT}"
 
listen "#{$RAILS_ROOT}/tmp/sockets/unicorn.sock", :backlog => 64
pid "#{$RAILS_ROOT}/tmp/pids/unicorn.pid"
 
timeout 60
 
preload_app true # ダウンタイムをなくす
 
stdout_path "#{$RAILS_ROOT}/log/unicorn.stdout.log"
stderr_path "#{$RAILS_ROOT}/log/unicorn.stderr.log"
 
GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true
 
before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
 
  old_pid = "#{server.config[:pid]}.oldbin"
    if old_pid != server.pid
      begin
        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
        Process.kill(sig, File.read(old_pid).to_i)
      rescue Errno::ENOENT, Errno::ESRCH
      end
    end
 
    sleep 1
  end
 
after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

WEB+DBPRESS vol.70の説明を元に項目を説明...

pid(path)

deamonizeしたときのPIDファイルが設置される場所

listen(address, options={})

unixソケットをlistenするのでNginxで設定したものを待ち受けます.

stdout_path(path)&stderr_path(path)

標準出力及び標準エラー出力の出力先です.
デーモン起動している場合,デフォルトでは標準のログは記録されないようなので必須です.

worker_processes(nr)

以下引用

起動するワーカプロセスの数を指定.
Unicornのワーカプロセスはシングルスレッドで動作する.
このworker_processesの値が,同時に処理できるリクエスト数.

そんなもんだと思っとけば大丈夫?

unicorn起動

unicornを起動します.

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

-cオプションでコンフィグファイルを指定します.
-EオプションでRAILS_ENVの指定をします.開発環境ならdevelopment.本番環境ならproduction.
-Dオプションはデーモンでの起動です.デーモンで起動しないなら-Dを付けなければ良いのです.

むすび

多分これでhttp://server_addressrailsアプリケーションにアクセスできるのではないかと思います.
セキュリティ的なこととか速度的なこととか考えてません.
最低限動くだけという設定です.
Nginxの設定とかソースからのコンパイルとかしっかり調べたいと思ってます.
あとrailsのインストールとかいつかまとめとこうとか思ってます.いつか・・・