1

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 は古いワーカー プロセスを使用し続けることができますか?

4

2 に答える 2

4

preload_app って知ってる?段階的な再起動と競合しますか?

証明: https://github.com/puma/puma/blob/0ea7af5e2cc8fa192ec82934a4a47880bdb592f8/lib/puma/configuration.rb#L333-L335

最初にどちらを使用するかを決定する必要があると思います。

于 2014-04-08T12:49:22.533 に答える