unicorn on nginx
少し前からSinatra用のWebサーバとしてthinを使ってたのだけど、logの吐き出し方や設定方法が面倒だと感じてきたので、unicornに移行してみた。
unicornの利点として以下があるようだ。
- マルチプロセスによるクラスターモデルではなく、Master-Slaveモデルのfork
- 利用メモリが少ない
- デプロイが早い
- thinと違って単一のログファイルに吐き出される
個人的に最後のログファイルの件が一番ありがたい。
さてインストールから
# gem install unicorn
Rails用に unicornrailsも一緒に入るが、今回はSinatra用なので使わない。
設定ファイルは以下のような感じにした。afterforkで実効ユーザIDを設定しなおすようにしている。
Rails用はprefork,afterforkで追加が必要。詳しくはここ
次に設定ファイル unicorn.conf
worker_processes 2
working_directory "/var/www/default"
timeout 30
listen "/tmp/unicorn.socket", :backlog => 64
pid "logs/unicorn.pid"
stderr_path "logs/unicorn.log"
stdout_path "logs/unicorn.log"
after_fork do |server,worker|
worker.user('www-data', 'www-data') if Process.euid == 0
end
このunicorn.confを使って、以下のように起動。
# unicorn -c unicorn.conf -D
これでMasterが起動し、設定ファイルに書いておいたサーバ数だけforkされる。
nginx.confの該当部分は以下のように書いた。
server {
listen 80;
server_name _;
access_log /var/log/nginx/access.log;
root /var/www/default/public;
location / {
try_files $uri $uri/index.html @unicorn;
}
location @unicorn {
proxy_pass http://unicorn;
}
}
upstream unicorn {
server unix:/tmp/unicorn.socket;
}
サーバの再起動などは以下のように kill コマンドで行う。詳しくはここ
再起動 kill -HUP 'masterのpid'
停止 kill -KILL 'masterのpid’