社内勉強会でUnicornについて発表したけどあまりの準備不足に全俺が泣いたので少しずつまとめていく〜その6
Unicornの設定ファイル
Unicornは、Rubyスクリプトを設定ファイルとして読み込み評価(eval)する。
$ unicorn --config-file=unicorn.conf.rb config.ru
設定ファイルは指定された場合だけ評価される。--config-fileオプション(もしくは-c)が省略されれば、デフォルトの設定で動作する。
instance_eval(File.read(config_file), config_file) if config_file
設定ファイルの読み込みと評価は上記の通りで、Unicorn::Configuratorクラスのインスタンスをコンテキストとしてevalする形になっている。つまり、設定ファイルで利用可能なディレクティブは、基本的にUnicorn::Configuratorクラスのインスタンスメソッドと同義。
チューニングに関するドキュメントも書かれている。
設定ファイルのサンプルも用意されている。
- http://unicorn.bogomips.org/examples/unicorn.conf.rb
- http://unicorn.bogomips.org/examples/unicorn.conf.minimal.rb
以降、ディレクティブについて書き連ねていく。
before_exec/before_fork/after_fork
フックが用意されているので、必要に応じてコールバック処理を定義すると良い。
- before_exec
- 新しいマスタプロセスを作る(reexec)際のexec()が実行される直前にあるフックポイント。
- before_fork
- ワーカープロセスをforkする直前にあるフックポイント。
- after_fork
- ワーカープロセスをfork後、いくつかの必要な処理を挟んだところにあるフックポイント。
after_forkでワーカープロセス個別にリスナーを登録することで、ワーカープロセスにダイレクトにリクエストを投げることができるので、デバッグなどで役立つことがあるはず。
preload_app
ワーカープロセスをforkする前に、マスタプロセスの中でアプリケーションをプリロードできる様にする。デフォルトで無効になっている。
この機能を有効にすることで、Copy-on-Writeフレンドリであればメモリ消費を抑えられる。ただし、マスタプロセスとワーカープロセスとの間でリソースを共有してしまう問題があるため、フックを利用してソケットを開き直すなどすること。ログファイルについては、アトミックな書き込みが出来るようにしているため、開き直す必要はない。
この機能が無効である場合、HUPシグナルによって設定ファイルをリロードした際にアプリケーションもリロードし、ワーカープロセスをグレースフルに再起動する。アプリケーションがロードされる際、常にGem.refreshが実行される。
user
ワーカープロセスのユーザとグループを指定することが出来る。指定しない場合は、マスタプロセスと同じものとなる。
ほか
- client_body_buffer_size
- listen
- logger
- pid
- rewindable_input
- stderr_path
- stdout_path
- timeout
- worker_processes
- working_directory