Как автоматизировать развертывание новых версий PHP-скриптов, работающих в фоновом режиме, без простоев?
У меня есть потребитель AMQP (потребитель RabbitMQ), написанный на PHP, который всегда работает в фоновом режиме. Этот скрипт запускается в нескольких узлах и 12 раз на узел: 12 запущенных фоновых процессов Unix:
php -f consumer.php &
,
Если необходимо развернуть новую версию кода, на данный момент мне всегда приходится вручную уничтожать ВСЕ эти процессы и снова запускать их по одному на каждом узле.
- Есть ли способ автоматизировать развертывание фоновых скриптов? Т.е. поместите его в конвейер развертывания и затем перезагрузите его, аналогично использованию https://deployer.org/.
- Есть ли способ избежать простоев?
- В любом случае ReactPHP поможет в этом случае?
1 ответ
Нашел ответ в документации по Laravel (решение работает для любого всегда работающего фонового процесса, а не только для PHP и Laravel). Супервайзер!
Настройка супервизора
Файлы конфигурации супервизора обычно хранятся в каталоге /etc/supervisor/conf.d. В этом каталоге вы можете создать любое количество файлов конфигурации, которые инструктируют супервизора, как следует отслеживать ваши процессы. Например, давайте создадим файл laravel-worker.conf, который запускает и отслеживает процесс queue: work:
Начальный руководитель
После создания файла конфигурации вы можете обновить конфигурацию Supervisor и запустить процессы, используя следующие команды:
перечитать sudo supervisorctl
обновление sudo supervisorctl
sudo supervisorctl start laravel-worker:*
Это даже поможет мне запустить столько процессов, сколько мне нужно, с помощью одного файла конфигурации и одной команды. Опять же, из документов 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:*
Я просто включу это как задачу Deployer в мой конвейер CI/CD.