Edited at

Railsアプリの開発環境でUnicornを手軽に扱うための設定とrake task

More than 3 years have passed since last update.

開発環境でUnicornを扱うときに何度も同じ設定をするのでメモしておく。


config


config/unicorn.rb

worker_processes 4

listen '/tmp/unicorn.sock'
pid '/tmp/unicorn.pid'

stderr_path File.expand_path('log/unicorn.log')
stdout_path File.expand_path('log/unicorn.log')

preload_app true


nginx 実践入門という書籍によると、ワーカのプロセス数を設定するときは


  • メモリ使用量が搭載量を超えないように注意すること

  • CPUの処理のみであればコア数と同じ数に設定するが、実際はDBのI/O待ちも発生するため、CPUコアの2倍程度を指定すると良い

と記されています。


rake task

Unicornを扱う上で起動・停止はコマンドが長くなり毎回打つのはめんどくさいので、rake taskで簡単に起動・停止を行います。


lib/tasks/unicorn.rake

namespace :unicorn do

desc 'Start unicorn'
task(:start) do
config_path = "#{Rails.root}/config/unicorn.rb"
sh "bundle exec unicorn_rails -c #{config_path} -p 8080 -D"
end

desc 'Stop unicorn'
task(:stop) { unicorn_signal(:QUIT) }

desc 'Restart unicorn with USR2'
task(:restart) { unicorn_signal(:USR2) }

desc 'Increment number of worker processes'
task(:increment) { unicorn_signal(:TTIN) }

desc 'Decrement number of worker processes'
task(:decrement) { unicorn_signal(:TTOU) }

desc 'Unicorn pstree (depends on pstree command)'
task(:pstree) do
sh "pstree '#{unicorn_pid}'"
end
end

# Helpers
def unicorn_signal(signal)
Process.kill signal, unicorn_pid
end

def unicorn_pid
File.read('/tmp/unicorn.pid').to_i
rescue Errno::ENOENT
raise 'Unicorn does not seem to be running'
end



参考