Как автоматизировать развертывание новых версий PHP-скрипта, работающего в фоновом режиме, без простоев?


У меня есть потребитель AMQP (потребитель RabbitMQ), написанный на PHP , всегда активный, работающий в фоновом режиме . Этот скрипт запускается на нескольких узлах и 12 раз на узел: 12 запущенных фоновых процессов unix:

php -f consumer.php &.

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

  1. Есть ли способ автоматизировать развертывание фоновых сценариев? Т.е. поместите его в конвейер развертывания, а затем перезагрузите их, аналогично использованию https://deployer.org.
  2. Есть ли способ избежать простоя?
  3. Каким образом ReactPHP поможет в этом случае?
Author: Willian Schneider, 2016-10-23

1 answers

Нашел ответ в документах Laravel (решение работает для любого всегда запущенного фонового процесса, а не только для PHP и Laravel). Руководитель!

Настройка супервизора

Файлы конфигурации супервизора обычно хранятся в каталоге /etc/supervisor/conf.d. В этом каталоге вы можете создать любое количество файлов конфигурации, которые будут указывать супервизору, как следует отслеживать ваши процессы. Например, давайте создадим laravel-файл worker.conf, который запускает и отслеживает очередь: рабочий процесс:

Стартовый супервайзер

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

Sudo supervisorctl перечитал

Обновление Sudo supervisorctl

Sudo supervisorctl запускает laravel-работника:*

Это даже поможет мне запустить столько процессов, сколько я захочу, с помощью одного файл конфигурации и одна команда. Опять же, из документов Laravel:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

При вызове sudo supervisorctl start laravel-worker:* запустится 8 фоновых процессов, которые также перезапустятся в случае ошибки.

Если я просто хочу перезапустить с новой выпущенной версией, я вызываю команду restart напрямую:

supervisorctl restart laravel-worker:*

Я просто интегрирую это как задачу развертывания в свой конвейер CI/CD.

 1
Author: Willian Schneider, 2016-10-23 00:44:56