unicorn-worker-killerのエラーがdevelopment環境で出る時

TECH
2016.07.07
Pocket

unicorn-worker-killerのエラーがdevelopment環境で出る時

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がどのように動いているのか勉強しようと思います

Pocket