Capistrano не перезапускает кластеры Mongrel должным образом

У меня есть кластер из трех дворняг, работающих под nginx, и я развертываю приложение с помощью Capistrano 2.4.3. Когда я "ограничиваю развертывание" при работающей системе, происходит следующее:

  1. Приложение развернуто. Код успешно обновлен.
  2. В выводе cap deploy есть следующее:

    • выполнение "sudo -p 'пароль sudo:' mongrel_rails cluster :: restart -C /var/www/rails/myapp/current/config/mongrel_cluster.yml "
    • серверы: ["myip"]
    • [myip] выполнение команды
    • ** [out :: myip] остановка порта 9096
    • ** [out :: myip] остановка порта 9097
    • ** [out :: myip] остановка порта 9098
    • ** [out :: myip] уже запустил порт 9096
    • ** [out :: myip] уже запустил порт 9097
    • ** [out :: myip] уже запустил порт 9098
  3. Я немедленно проверяю сервер и обнаруживаю, что Mongrel все еще работает, а файлы PID для предыдущих трех экземпляров все еще присутствуют.
  4. Спустя короткое время (менее одной минуты) я обнаружил, что Mongrel больше не работает, файлы PID исчезли, и ему не удалось перезапустить.
  5. Если я запускаю mongrel на сервере вручную, приложение запускается нормально.

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

Обновлено: Вот ответ:

mongrel_cluster в задаче «перезапуск» просто делает следующее:

 def run
   stop
   start
 end

Он не ожидает или не проверяет, завершился ли процесс до вызова команды «start». Это отправлена ​​известная ошибка с выдающимся патчем. Я применил патч к Mongrel Cluster, и проблема исчезла.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
1 880
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я ненавижу быть таким простым, но похоже, что файлы pid все еще торчат, когда он пытается запуститься. Убедитесь, что дворняга остановлена ​​вручную. Очистите файлы pid вручную. Потом делайте шапку развёртывать.

Во-первых, сузьте область тестирования, позвонив только cap deploy:restart. Возможно, вы захотите передать параметр --debug для запроса перед удаленным выполнением или параметр --dry-run, чтобы увидеть, что происходит, когда вы настраиваете свои параметры.

На первый взгляд это звучит как проблема с разрешениями для файлов pid или mongrel-процессов, но это сложно сказать наверняка. Несколько вещей, которые бросаются в глаза:

  • переменная :runner явно установлена ​​на nil - Для этого была конкретная причина?
  • Capistrano 2.4 представил новое поведение для переменной :admin_runner. Возможно, это связано с вашей проблемой, если вы не видите весь рецепт?

    :runner vs. :admin_runner (from capistrano 2.4 release) Some cappers have noted that having deploy:setup and deploy:cleanup run as the :runner user messed up their carefully crafted permissions. I agreed that this was a problem. With this release, deploy:start, deploy:stop, and deploy:restart all continue to use the :runner user when sudoing, but deploy:setup and deploy:cleanup will use the :admin_runner user. The :admin_runner variable is unset, by default, meaning those tasks will sudo as root, but if you want them to run as :runner, just do “set :admin_runner, runner”.

Моя рекомендация, что делать дальше. Вручную остановите дворняжек и очистите PID. Запустить дворняг вручную. Затем продолжайте запускать cap deploy:restart во время отладки проблемы. При необходимости повторите.

Спасибо, Райан. Я думаю, ты меня отвязал. Когда я ее решу, я свяжусь с ней.

Pete 01.10.2008 06:40
Ответ принят как подходящий

Вы можете явно указать рецептам mongrel_cluster удалить файлы pid перед запуском, добавив следующее в свои рецепты капистрано:

# helps keep mongrel pid files clean
set :mongrel_clean, true

Это заставляет его передать параметр --clean в mongrel_cluster_ctl.

Я вернулся и посмотрел на один из моих рецептов развертывания и заметил, что я также изменил способ работы моей задачи перезапуска. Взгляните на следующее сообщение в группе пользователей mongrel:

беспорядочные пользователи обсуждение перезагрузки

Вот мое развертывание: задача перезапуска. Я признаю, что это что-то вроде взлома.

namespace :deploy do
  desc "Restart the Mongrel processes on the app server."
  task :restart, :roles => :app do
    mongrel.cluster.stop
    sleep 2.5
    mongrel.cluster.start
  end
end

Это на правильном пути. См. Мое изменение вопроса: есть патч для mongrel_cluster, который исправляет поведение.

Pete 02.10.2008 20:53

В любом случае, мои дворняги запускаются до того, как предыдущая команда останова завершила их отключение.

sleep 2.5 - не лучшее решение, если для остановки всех запущенных дворняг требуется больше 2,5 секунд.

Похоже, есть потребность в:

stop && start

против.

stop; start

(так работает bash, && ожидает завершения первой команды без ошибки, а ";" просто выполняет следующую команду).

Интересно, есть ли:

wait cluster_stop
then cluster_start

Взгляните на это: rubyforge.org/tracker/…

Pete 02.12.2008 21:46

Хорошее обсуждение: http://www.ruby-forum.com/topic/139734#745030

Другие вопросы по теме