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