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 пытается её запустить.