Dec 14th, 2010

unicorn on nginx

少し前からSinatra用のWebサーバとしてthinを使ってたのだけど、logの吐き出し方や設定方法が面倒だと感じてきたので、unicornに移行してみた。

unicornの利点として以下があるようだ。

  • マルチプロセスによるクラスターモデルではなく、Master-Slaveモデルのfork
  • 利用メモリが少ない
  • デプロイが早い
  • thinと違って単一のログファイルに吐き出される

個人的に最後のログファイルの件が一番ありがたい。

さてインストールから

# gem install unicorn

Rails用に unicornrailsも一緒に入るが、今回はSinatra用なので使わない。
設定ファイルは以下のような感じにした。after
forkで実効ユーザ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’