Puma предоставляет три различных вида операций перезапуска, каждый из которых предназначен для разных случаев использования. В этом документе описывается "горячий перезапуск" и "фазированный перезапуск". Третий вид операции перезапуска называется "refork" и описан в документации для fork_worker
.
Для выполнения "горячего" перезапуска Puma выполняет операцию exec
, чтобы снова запустить процесс, поэтому между старым и новым процессом не происходит обмена памятью. В результате, перезапуск можно выполнять в любом месте, где вы бы вручную остановили Puma и снова его запустили. В частности, безопасно обновлять Puma само при помощи горячего перезапуска.
Если новый процесс не может загрузиться, он просто завершит работу. Поэтому вы должны запускать Puma под управлением процессного монитора при использовании его в продакшне.
Любое из следующего приведет к выполнению горячего перезапуска Puma сервера:
SIGUSR2
процессу puma
/restart
pumactl restart
(это использует метод управления сервером, если он доступен, в противном случае отправляет сигнал SIGUSR2
процессу)Работает в режиме кластера и одиночного режима
Поддерживается на всех платформах### Опыт клиента
Все платформы: клиенты с активными запросами получают ответы перед тем, как соединение будет закрыто грациозно. Puma грациозно отключает любые бездействующие HTTP-соединения перед перезапуском.
На MRI или TruffleRuby на Linux и BSD: клиенты, которые подключаются непосредственно перед перезапуском сервера, могут столкнуться с увеличенной задержкой, пока сервер не остановится и не запустится снова, но их соединения не будут закрыты преждевременно.
На Windows и JRuby: клиенты, которые подключаются непосредственно перед перезапуском, могут столкнуться с ошибками "connection reset".### Дополнительные примечания
Новый запущенный процесс Puma изменяет текущую рабочую директорию на директорию, указанную опцией directory
. Если directory
указывает на символическую ссылку, это автоматически переоценивается, поэтому эту механику можно использовать для обновления приложения.
В любой момент времени работает только одна версия приложения.
on_restart
вызывается сразу перед тем, как сервер останавливается. Это можно использовать для освобождения ресурсов (например, долгоживущих соединений с базой данных) грациозно. С Ruby 2.0 обычно не требуется явно закрывать дескрипторы файлов при перезапуске. Это связано с тем, что любой дескриптор файла, открытый Ruby, имеет установленный флаг FD_CLOEXEC
, что означает, что дескрипторы файлов закрываются при exec
. Тем не менее, on_restart
полезен, если вашему приложению необходимо выполнить какие-либо более грациозные процедуры завершения работы, специфичные для протокола, перед закрытием соединений.
Любое из следующего приведёт к выполнению постепенного перезапуска Puma сервером:
SIGUSR1
процессу puma
GET
к серверу статуса/управления Puma с путём /phased-restart
pumactl phased-restart
(эта команда использует метод управления сервером, если он доступен, в противном случае отправляет сигнал SIGUSR1
процессу)prune_bundler
включен и что preload_app!
отключенdirectory
. Если directory
указывает на символическую ссылку, это автоматически переоценивается, поэтому этот механизм можно использовать для обновления приложения.on_restart
не вызываетсяpuma
сам по себе, а также всё, что находится в extra_runtime_dependencies
и их зависимостей. Обновление других джемов безопасно.extra_runtime_dependencies
, которые имеют native расширения или имеют зависимости, которые имеют native расширения (одним из распространённых примеров является puma_worker_killer
и его зависимость от ffi
). Рабочие процессы будут завершаться с ошибкой при запуске во время постепенного перезапуска.Подобная проблема зафиксирована в проблеме проекта rubygems. Горячие перезапуски являются вашим единственным вариантом здесь, если вам необходимы эти зависимости.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )