Railsを運用する時によく使うのが「Nginx×Unicorn」の組み合わせです
しかしUnicornを動かしているとガンガンメモリを食ってしまうことがあります。そんな時に便利なのがunicorn-worker-killerというGem
このGemはUnicornのworkerプロセスを適当なタイミングで再起動してくれます
config.ruに設定を以下のように書き入れるとUnicornのWorkerを管理してくれます
# config.ru require 'unicorn/worker_killer' use Unicorn::WorkerKiller::MaxRequests, 3072, 4096, true use Unicorn::WorkerKiller::Oom, (192*(1024**2)), (256*(1024**2)), 16
(詳しい設定はこちらのブログを参考にしてみてください)
development環境ではエラーが出る
多くの方がローカルの開発環境ではUnicornを使ってないのではないでしょうか
しかし「rails s」でサーバーを起動するとこんなエラーが出ます
`require': cannot load such file -- unicorn/worker_killer (LoadError)
起動しようとしたけれどそもそもUnicornを使ってないのでどうしようもないんですよね
そこでproduction環境のみunicorn-worker-killerを使うように設定します
config.ruに環境ごとに分岐する設定を書いてあげる
unicorn-worker-killerはproduction環境だけで使いたい
なのでconfig.ruにそれを書いてあげればおーけーです
if ENV['RAILS_ENV'] == 'production' require 'unicorn/worker_killer' use Unicorn::WorkerKiller::MaxRequests, 3072, 4096, true use Unicorn::WorkerKiller::Oom, (192*(1024**2)), (256*(1024**2)), 16 end
RAILS_ENVでどの環境なのかを取得できるので、productionの時のみunicorn-worker-killerの設定を読み込むようにしました
まとめ
Gemfileでproductionに入れておけば大丈夫と思ったら、そんなこともありませんでした
サーバーを起動する時に読み込むファイルに知らんもんが書かれていたらエラーが出るのは当たり前ですね
今までconfig.ruをほとんど触ったことがなかったので焦りました…orz
これを機にRailsがどのように動いているのか勉強しようと思います