Nginx по-прежнему перезапускает приложение Rails с capistrano - PullRequest
8 голосов
/ 07 июля 2011

За свою жизнь я не могу понять, как правильно сделать эту работу.

Проблема похожа на то, что есть у других, например: Как сделать повторный запусккластер шавок

Однако мы используем Nginx / Passenger вместо Mongrel.

Проблема заключается в том, что при развертывании мы используем этот стандарт: задача рестарта:

task :restart, :roles => [:app], :except => {:no_release => true} do
  run "cd #{deploy_to}/current && touch tmp/restart.txt"
end

Он затрагивает файл restart.txt на каждом веб-сервере, но все экземпляры пассажиров, которые в данный момент обслуживают запросы, должны завершиться до появления новых.Это создает серьезную задержку и приводит к тому, что наше приложение будет недоступно до 2 минут, пока все возвращается в исходное состояние.

Чтобы обойти это, план должен сделать следующее:

  1. код развертывания
  2. перейдите на сервер 1, удалите его из балансировщика нагрузки
  3. перезапустите nginx-passenger на сервере 1
  4. подождите 60 секунд
  5. добавьте сервер 1 обратно к балансировщику нагрузки
  6. перейдите на сервер 2 (повторите шаги 3 - 5)

Чтобы выполнить это, я попытался сделать следующее:

(фунт.txt - это файл, который ищет балансировщик нагрузки)

task :restart, :roles => [:app], :except => {:no_release => true} do
  servers = find_servers_for_task(current_task)
  servers.map do |s|
    run "cd #{deploy_to}/current && echo '' > public/lb.txt", :host => s.host
    run %Q{rvmsudo /etc/init.d/nginx-passenger restart > /dev/null}, :host => s.host
    sleep 60
    run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt", :host => s.host
  end
end

Этот почти работает, однако во время развертывания он, казалось, запускал цикл через серверы один раз для серверов, перечисленных в: роль приложения.В настоящее время у нас есть 6 серверов приложений, поэтому цикл запускается 6 раз, перезапуская nginx-passenger 6 раз на сервер.

Мне просто нужен этот цикл для запуска один раз.

Я знаю, что это кажетсячто в конечном итоге пассажир получит повторный перезапуск, но, похоже, он еще не существует.

Если это поможет, мы используем Capistrano 2.x и Rails 3

Любая помощь будет отличной.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 15 июля 2011
run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt", :host => s.host

должно быть:

run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt", :hosts => s.host
2 голосов
/ 19 мая 2013

Я наткнулся на этот драгоценный камень capify-ec2, у которого есть функция повторного запуска. capify-ec2 на github.

Я собираюсь установить его и попробовать.

Вот описание из файла readme, в котором описывается, что делает их функция повторного запуска:

"Эта функция позволяет развертывать ваш код на экземплярах по одному, а не одновременно. Это становится полезным для более сложных приложений, запуск которых после развертывания может занять больше времени. Capistrano выполнит полное развертывание (включая любые настраиваемые хуки) для одного экземпляра, при необходимости выполните проверку работоспособности HTTP для экземпляра, а затем переходите к следующему экземпляру, если развертывание прошло успешно.

После развертывания отображается отчет о состоянии, указывающий, на каких экземплярах развертывания прошло успешно, не удалось или не началось. При некоторых сбоях может потребоваться дальнейшее действие вручную, например, если экземпляр удален из ELB (см. раздел «Использование с эластичными балансировщиками нагрузки» ниже), и развертывание завершается неудачно, экземплярне будет перерегистрироватьпо соображениям безопасности - с ELB. "

...