Railsへのunicornのインストール


Railsへのunicorn(Webサーバ)の導入手順です。Rails標準のWebサーバpumaはマルチスレッドなのでスレッドセーフな実装が必要です。一方でunicornはマルチプロセスなのでスレッドを意識せずに実装ができます。既存アプリケーションを運用する際にスレッドセーフ出ない場合は、unicornを選択するとよいと思います。

🐝 インストール

Gemfileに以下を追加してbundle installを実行。

# Web Server
gem 'unicorn'

🎂 設定

config/unicorn.rbにunicornの設定を記述。

# プロジェクトのルート
rails_root = ENV['RAILS_ROOT'] || File.expand_path('../../', __FILE__)

if ENV['RAILS_ENV'] == 'development' # for pry
worker_processes 1
else
worker_processes ENV['UNICORN_WORKER_PROCESSES'].to_i > 0 ? ENV['UNICORN_WORKER_PROCESSES'].to_i : 2
preload_app true # Unicornの再起動時にダウンタイムなしで再起動

stderr_path "#{rails_root}/log/unicorn_stderr.log"
stdout_path "#{rails_root}/log/unicorn_stdout.log"
pid "#{rails_root}/tmp/pids/unicorn.pid"
end

working_directory rails_root

timeout 300

listen 3000
listen "#{rails_root}/tmp/sockets/unicorn.sock"

before_fork do |server, worker|
ApplicationRecord.connection.disconnect! if defined?(ApplicationRecord) && ApplicationRecord.connected?

old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
# USR2シグナルを受けると古いプロセスを止める
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
Process.kill(sig, File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end
end

after_fork do |_server, _worker|
ApplicationRecord.establish_connection if defined?(ApplicationRecord)
end

👽 サーバの起動

次のコマンドでサーバを起動。

bundle exec unicorn_rails -c config/unicorn.rb

😎 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍