1

私はこの宝石をしばらく使用しており、実際のステージング環境をステージング サーバーにデプロイしようと試みたところ、問題が発生しました。Unicorn はコマンドから開始し、unicorn_railsすべて-E productionの設定が正しいにもかかわらずです。

deploy.rb で、unicorn_bin 変数が unicorn_rails として設定されていることに気付きました。deploy.rb でこの設定を取り出しました。ただし、 unicorn:duplicate はunicorn_rails、デフォルトが である必要がある場合でも、コマンドを実行しますunicorn

マルチステージ セットアップ wiki ドキュメントで概説されているように、私の変数はすべて deploy/staging.rb でステージングに設定されていますが、-E がまだ運用環境に設定されていることに気付きました。

関連情報:

デプロイ後の unicorn.log ファイルからの出力は次のとおりです。

executing ["/var/www/apps/myapp/shared/bundle/ruby/2.0.0/bin/unicorn_rails", "-c", "/var/www/apps/bundio/current/config/unicorn.rb", "-E", "production", "-D", {12=>#<Kgio::UNIXServer:/tmp/bundio.socket>, 13=>#<Kgio::TCPServer:fd 13>}] (in /var/www/apps/bundio/current)

これが出力ですcap -T(デフォルトはステージング)

# Environments
rails_env          "staging"
unicorn_env        "staging"
unicorn_rack_env   "staging"

# Execution
unicorn_user       nil
unicorn_bundle     "/usr/local/rvm/gems/ruby-2.0.0-p247@global/bin/bundle"
unicorn_bin        "unicorn"
unicorn_options    ""
unicorn_restart_sleep_time  2

# Relative paths
app_subdir                         ""
unicorn_config_rel_path            "config"
unicorn_config_filename            "unicorn.rb"
unicorn_config_rel_file_path       "config/unicorn.rb"
unicorn_config_stage_rel_file_path "config/unicorn/staging.rb"

# Absolute paths
app_path                  "/var/www/apps/myapp/current"
unicorn_pid               "/var/www/apps/myapp/shared/pids/unicorn.myapp.pid"
bundle_gemfile            "/var/www/apps/myapp/current/Gemfile"
unicorn_config_path       "/var/www/apps/myapp/current/config"
unicorn_config_file_path  "/var/www/apps/myapp/current/config/unicorn.rb"
unicorn_config_stage_file_path
->                        "/var/www/apps/myapp/current/config/unicorn/staging.rb"

もう 1 つの興味深い点として、unicorn_rails -E フラグはレール環境を参照する必要がありますが、unicorn -E はラック環境を参照する必要があります。ラック環境は開発と展開の値のみを取得する必要がありますが、本番環境に設定されます。奇妙な ( RACK_ENV 変数の設定については、ユニコーンのドキュメントを参照してください。

これについての洞察は大歓迎です。私のステージング サーバーでは、RAILS_ENV もステージングに設定しました。環境フォルダーに staging.rb を追加したり、database.yml にステージング セクションを追加したりするなど、別の環境用に Rails をセットアップしました。

unicorn_rack_env に関する lib/capistrano-unicorn/config.rb の重要な行:

_cset(:unicorn_env)                { fetch(:rails_env, 'production' ) }
_cset(:unicorn_rack_env) do
# Following recommendations from http://unicorn.bogomips.org/unicorn_1.html
fetch(:rails_env) == 'development' ? 'development' : 'deployment'
end

前もって感謝します。

4

1 に答える 1

0

OK、長い間正しい環境を持っていなかった後、問題を発見しました!

基本的に、私の init スクリプトは、capistrano-unicorn bin が機能する前に実行されていました。

そのため、 capistrano-unicorn がユニコーンの再起動/リロード/複製タスクを実行しているときに、Unicorn とそのワーカーを管理するための init.d または upstart スクリプトが考慮されるようにしてください。

古い pid ファイルをデバッグしなければならないときに、これらのスクリプトを見ようとは思いませんでした / 既に実行中 / ソケット エラーをリッスンできません。しかし、 upstart は実行されていないときに Unicorn を起動し、 capistrano-unicorn も Unicorn を起動しようとしているため、理にかなっています。

これらの capistrano タスクとフックを Monit と Unicorn init スクリプトと組み合わせました。

カピストラーノのタスク:

namespace :monit do
  desc ' wait 20 seconds '
  task :wait_20_seconds do
    sleep 20
  end
  task :monitor_all, :roles => :app do
    sudo "monit monitor all"
  end

  task :unmonitor_all, :roles => :app do
    sudo "monit unmonitor all"
  end

  desc 'monitor unicorn in the monit rc file'
  task :monitor_unicorn, :roles => :app do
    sudo "monit monitor unicorn"
  end

  desc 'unmonitor unicorn in the monit rc file'
  task :unmonitor_unicorn, :roles => :app do
    sudo "monit unmonitor unicorn"
  end
end

カピストラーノ フック:

after 'deploy:restart', 'unicorn:duplicate'  # app preloaded. check https://github.com/sosedoff/capistrano-unicorn section for zero downtime

before 'deploy', "monit:unmonitor_unicorn"
before 'deploy:migrations', "monit:unmonitor_unicorn"

after 'deploy', 'monit:wait_20_seconds'
after "deploy:migrations", "monit:wait_20_seconds"

after 'monit:wait_20_seconds', 'monit:monitor_unicorn'

Monit を使用してユニコーン プロセスを監視します。

/etc/monit/monitrc 内:

check process unicorn
  with pidfile /var/www/apps/my_app/shared/pids/mypid.pid
  start program = "/usr/bin/sudo service unicorn start"
  stop program = "/usr/bin/sudo service unicorn stop"

init スクリプト内で、ユニコーン プロセスを次のように開始し unicorn_rails -c /var/www/apps/my_app/current/config/unicorn.rb -E staging -D ます。 -E フラグが正しい環境に設定されていることを確認します。capistrano-unicorn gem には:set、そのユニコーン プロセスの環境を指定できる deploy.rb 内の using ディレクティブがあります。

于 2014-02-02T21:56:11.233 に答える