MRI 2.1.0 で Rails 4 プロジェクトのアプリケーション サーバーとして Puma を使用しています。Capistrano 3 を使用してデプロイメントを処理しています。すべてが魅力のように機能しています。しかし、最近、展開プロセスに問題があることに気付きました。次に Gemfile を変更すると、puma は段階的な再起動を完了できず、最終的にすべてのワーカーが強制終了されます。Puma をクラスター モードで実行しており、preload_app!
true に設定されています。
段階的な再起動を処理するためのカピストラーノのレシピを次に示します。
desc "Restart the application (phased restart)"
task :phased_restart do
on roles(:app) do |h|
execute "cd #{fetch(:current_path)} && bundle exec pumactl -S #{fetch(:puma_state)} phased-restart", :pty => true
end
end
これは Capistrano ログの切り捨てられた出力です。
DEBUG [4790766f] Command: cd /home/app/current && bundle exec pumactl -S /home/app/shared/tmp/pids/puma.state phased-restart
DEBUG [de00176a] Command phased-restart sent success
INFO [de00176a] Finished in 0.909 seconds with exit status 0 (successful).
これは私のconfig/puma.rb
ファイルです。
#!/usr/bin/env puma
require 'active_support'
environment 'production'
daemonize
pidfile '/home/app/shared/tmp/pids/puma.pid'
state_path '/home/app/shared/tmp/pids/puma.state'
stdout_redirect 'log/puma_stdout.log', 'log/puma_stderr.log'
threads 100, 100
bind 'tcp://0.0.0.0:9292'
bind 'unix:////home/app/shared/tmp/pids/puma.sock'
on_worker_boot do
ActiveSupport.on_load(:active_record) do
ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
ActiveRecord::Base.establish_connection(YAML.load_file("#{Rails.root}/config/database.yml")[Rails.env])
end
end
workers 4
preload_app!
私の puma 設定ファイルに何か問題があると思われる人はいますか?
ですから、現在、私はbundle exec cap production deploy:start
これが起こったときに Puma を開始します。しかし、私はあらゆる場合にダウンタイムゼロの展開を望んでいます。
新しい生成されたプロセスを開始できなかった場合、Puma は古いワーカー プロセスを使用し続けることができますか?