Инфраструктура и серверы/ Supervisor

Supervisor на сервере: установка и запуск процессов

Что поднимаем

Supervisor нужен, когда процесс должен жить постоянно: queue worker, websocket-сервер, отдельный бот, парсер, consumer. Команду можно запустить руками из SSH, но после закрытия терминала или перезагрузки сервера она пропадёт. Supervisor держит процесс запущенным и поднимает его заново после падения.

Я использую его там, где удобнее хранить несколько маленьких конфигов в /etc/supervisor/conf.d и управлять ими через supervisorctl.

Установка

Debian / Ubuntu

sudo apt update
sudo apt install supervisor
sudo systemctl enable supervisor
sudo systemctl start supervisor
sudo systemctl status supervisor

AlmaLinux / Rocky / CentOS

sudo dnf install epel-release
sudo dnf install supervisor
sudo systemctl enable supervisord
sudo systemctl start supervisord
sudo systemctl status supervisord

На Debian-служба обычно называется supervisor, на RHEL-подобных системах — supervisord. Если не уверены, смотрю точное имя так:

systemctl list-units --type=service | grep -i supervisor

Конфиг программы

Каждый процесс лучше держать отдельным файлом в /etc/supervisor/conf.d. Пример для Laravel worker:

[program:shop-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /var/www/shop/artisan queue:work redis --queue=default --sleep=3 --tries=3 --timeout=60
directory=/var/www/shop
user=www-data
numprocs=1
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=/var/www/shop/storage/logs/supervisor-worker.log
stopwaitsecs=3600

Файл:

sudo nano /etc/supervisor/conf.d/shop-worker.conf

Пути

В command лучше указывать полный путь к PHP. На серверах с ISPManager системный php и PHP сайта часто разные.

Подключение конфига

После создания или правки файла Supervisor сам его не подхватывает. Нужны две команды: перечитать конфиги и применить изменения.

sudo supervisorctl reread
sudo supervisorctl update

Запуск и проверка:

sudo supervisorctl start shop-worker:*
sudo supervisorctl status

Если меняли только команду или код приложения, обычно достаточно перезапуска конкретной программы:

sudo supervisorctl restart shop-worker:*

Команды на каждый день

КомандаЧто делает
supervisorctl statusПоказывает состояние всех программ.
supervisorctl rereadНаходит новые или изменённые конфиги.
supervisorctl updateДобавляет новые программы и применяет изменения.
supervisorctl restart name:*Перезапускает группу процессов.
supervisorctl tail -f name stderrПоказывает stderr конкретной программы, если он не перенаправлен в stdout.

Где смотреть ошибки

Сначала смотрю статус:

sudo supervisorctl status

Частые состояния: RUNNING, STOPPED, BACKOFF, FATAL. Если процесс сразу падает, открываю его лог:

tail -n 100 /var/www/shop/storage/logs/supervisor-worker.log

И системный лог Supervisor:

sudo journalctl -u supervisor -n 100 --no-pager
# или
sudo journalctl -u supervisord -n 100 --no-pager

Самые частые причины падения: неверный путь к PHP, нет прав на каталог проекта, не найден artisan, команда требует переменные окружения, лог-файл нельзя создать.

Несколько процессов

Если нужно держать несколько одинаковых worker-процессов, увеличиваем numprocs. Тогда process_name с %(process_num)02d обязателен, иначе Supervisor не сможет различать процессы.

[program:shop-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /var/www/shop/artisan queue:work redis --queue=default --sleep=3 --tries=3 --timeout=60
directory=/var/www/shop
user=www-data
numprocs=3
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/shop/storage/logs/supervisor-worker.log

После reread и update в статусе появятся shop-worker_00, shop-worker_01, shop-worker_02.

Мини-чеклист

sudo systemctl status supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status
tail -n 100 /var/www/shop/storage/logs/supervisor-worker.log

Если процесс в FATAL, не перезапускаю его вслепую. Сначала проверяю команду из конфига вручную под тем же пользователем, под которым Supervisor пытается её запустить.

Теги

Читать дальше