REMPで今までApacheのリバースプロキシを通してthinサーバでAPIを稼働させていたのですが、稼働時間が長くなるとメモリの利用割合が増える状況が続いていたため、どうしようかと悩んでいたところ会社でmizzyさん(@gosukenator)からunicornだとメモリ利用量が押さえられるという話を伺ったので早速切り替えてみました。
unicornは、Rack 環境をロードした master プロセスが fork して子の worker を作る仕組みになっているため、安定性とメモリ利用量を小さくすることができることが期待されます。
unicornのインストールはgemを使うことで簡単に行えます。
$ sudo gem install unicorn
現在、REMPのAPIサーバはthinで動いているのでアプリケーションのルートにunicornの設定ファイルを書き足すことでunicorn上でアプリをすぐに動かすことができます。
ここでは、
- Apacheのリバースプロキシから内部の4044番ポートにフォワード
- unicornのワーカーは4本作る
- preload_appを有効にして、workerをforkする前のアプリケーションの先読みを有効にする
設定例を書いています。
# unicorn.conf listen "/tmp/unicorn.sock", :backlog => 64 preload_app true port = 4044 listen port worker_processes 4 pid "tmp/pids/unicorn.pid" stderr_path "log/unicorn_error.log" stdout_path "log/unicorn_out.log"
この設定ファイルを書き足せば以下のコマンドですぐに動かすことができます。
(-Dでデーモン化)
$ unicorn -c unicorn.conf -D
設定ファイル内のログに正常にログが吐かれていれば、稼働していることを確認することができます。
$ cat log/unicorn_error.log 125.***.***.*** - - [18/Mar/2012 18:56:11] "GET /status/info HTTP/1.1" 200 2 0.0045 125.***.***.*** - - [18/Mar/2012 18:56:11] "GET /status/info HTTP/1.1" 200 2 0.0531