light log

学んだこととか

Unicornの設定をする

昨日↓に引き続き、

yamacent.hatenablog.com

一昨日↓の設定ファイルの見直しをする。

yamacent.hatenablog.com

今日は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を使うなら必要そうだからつけてる。。

まとめ

とりあえずこれで良い…のかな。