Unicornの設定をする
昨日↓に引き続き、
一昨日↓の設定ファイルの見直しをする。
今日はUnicorn。
完成形
以下のようにした。
ほぼ、以下二つのページのコピペ。
アプリのルート/config/unicorn.rb
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3) timeout 15 preload_app true listen '/tmp/unicorn.sock' pid '/tmp/unicorn.pid' before_fork do |server, worker| Signal.trap 'TERM' do puts 'Unicorn master intercepting TERM and sending myself QUIT instead' Process.kill 'QUIT', Process.pid end defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! end after_fork do |server, worker| Signal.trap 'TERM' do puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' end defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end
設定内容
上に挙げた二つのリンクだけど、一つ目のリンク先も二つ目を参考にしているとのことなので、結局この設定のベースは二つ目のページになる。
それで二つ目のページは、Heroku Dev Centerの日本語訳なので、Herokuにデプロイする前提の設定例になっているんだけど、基本的にはHerokuじゃなくても使えるだろうと思ってそのまま流用している。
以下では個々の設定内容について自分の理解を簡単に書くけれど、上記Heroku Dev Centerの劣化コピー的な内容でしかないので詳細はそっちを参照することを推奨。
worker_processes
Unicornは、リクエストを振り分ける一つのmasterプロセスと、実際にリクエストを処理する複数のworkerプロセスで構成されるアーキテクチャになっている。
worker_processes
はworkerプロセスの数を指定する。
実際のアプリのメモリ使用量などを見ながらworker数を調節できるように、環境変数を指定できるようにしてあるとのこと。
timeout
timeoutの秒数。
preload_app
trueを指定するとアプリを事前に読み込む。こうすることでworkerプロセスの起動時間を短縮できる。
Signal.trap 'TERM'
UnicornはQUITシグナルを受け取ったときにグレースフルシャットダウンするので、TERMを受け取ったときに適切なアクションに切り替える設定をしている。
QUIT 時には、現在のリクエスト処理が終わるのを待ってからmasterが各workerをシャットダウンし、最後に自身をシャットダウンする。そのため、適切なアクションとは、masterの場合は自身にQUITを送ってシャットダウン処理を開始すること、workerの場合は(masterからシャットダウン指令が来るので)TERMは無視すること、になっている。
defined?(ActiveRecord::Base)らへん
あんまりよくわかっていない。
ActiveRecordを使うなら必要そうだからつけてる。。
まとめ
とりあえずこれで良い…のかな。