【Ruby on Rails】ローカル環境でunicornを設定する
実は何度かサイトを公開しようと思って失敗しております...
そこで、本番を想定して少しずつサーバ周りを覚えていこうと思い、ひとまずローカルでunicornを設定して動くかを確かめてみようと思ったのが、これをやろうと思ったきっかけです。
Gemfileにunicornを記載
デフォルトだとコメントアウトされているので、それを有効にする
gem 'unicorn'
unicornの設定ファイルを作成
一行ずつ何をするためのものなのかを参考にしつつ、調べて微調整。
# Rails のルートパスを設定(RAILS_ROOT/config/unicorn.rbに配置している場合)
rails_root = File.expand_path('../../', __FILE__)
# RAILS_ENV を設定(RAILS_ENVごとに挙動を変えたい場合に使用。)
# rails_env = ENV['RAILS_ENV'] || 'development'
# capistrano の unicorn restart のエラー解消
before_exec do |server|
ENV['BUNDLE_GEMFILE'] = "#{rails_root}/Gemfile"
end
# ワーカー数の定義
worker_processes 2
# Unicornの起動コマンドを実行するディレクトリを指定
working_directory rails_root
# 接続タイムアウト時間
timeout 30
# Unicornのエラーログと通常ログの吐き出しファイルを指定
stderr_path File.expand_path('../../log/unicorn_stderr.log', __FILE__)
stdout_path File.expand_path('../../log/unicorn_stdout.log', __FILE__)
# Nginxで使用する場合はこちらの設定
# listen File.expand_path('../../tmp/sockets/unicorn.sock', __FILE__)
# ひとまずローカルで8080
listen 8080
# プロセス停止などに必要なPIDファイルの保存先を指定
pid File.expand_path('../../tmp/pids/unicorn.pid', __FILE__)
# Unicorn再起動時にダウンタイムなしで再起動を設定
preload_app true
# USR2シグナルを受けると古いプロセスを止める
before_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
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|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
途中にcapistranoのエラー対応のものもあったので一応入れておいた。
unicorn の起動と停止
unicornの起動は以下のコマンド。今まで`rails s`をしていたものをこちらに修正。
bundle exec unicorn_rails -c config/unicorn.rb
unicorn を起動して、`http://localhost:8080`にアクセスすると画面が表示される。
次にunicornの停止コマンドはこちら。
kill -QUIT `cat tmp/pids/unicorn.pid`
初心者でしょうもないことなんじゃけど、`/path/to/~~`って結構分かりづらかったりする...
ここはunicornで設定したPIDファイルの保存先を指定。
これでローカル環境でunicornが動くようになった!
一安心!ここまでunicornの設定が細かく書いてあると分かりやすかった!
設定の参考にしたのはこちらの記事です。