Как исправить зависшую службу PHP-FPM на Ubuntu (502 Bad Gateway)
Ваш сайт Nginx недоступен с ошибкой 502 Bad Gateway. Вы перезапускаете PHP-FPM и получаете ошибку вроде Job for php8.3-fpm.service failed.... Вот быстрый и надежный способ, которым я это исправляю.
1) Найдите настоящую проблему
Когда systemctl
показывает сбой, такой как status=78
, это часто указывает на плохую конфигурацию. Начните с проверки конфигурации:
sudo php-fpm8.3 -t
Если это проходит, но служба все равно не запускается, проверьте полные журналы службы:
sudo journalctl -xeu php8.3-fpm.service
Ищите строку ERROR, похожую на:
ERROR: Another FPM instance seems to already listen on /var/run/php/your-socket-name.sock
Это означает, что старый/зависший процесс PHP-FPM все еще прослушивает сокет, блокируя новый экземпляр.
2) Исправление: очистка старого процесса
В командах ниже замените /var/run/php/your-socket-name.sock
на фактический путь к сокету из вашего журнала ошибок.
Найдите зависший процесс (PID)
sudo lsof /var/run/php/your-socket-name.sock
Это выведет процесс, удерживающий сокет (вероятно, запущенный от имени
root
). Запишите его PID.Остановите этот процесс
# Замените 12345 на фактический PID sudo kill 12345
Если он отказывается завершиться через несколько секунд, вы можете принудительно завершить его (используйте с осторожностью):
sudo kill -9 12345
Удалите устаревший файл сокета
sudo rm /var/run/php/your-socket-name.sock
PHP-FPM воссоздаст его при запуске.
Запустите PHP-FPM
sudo systemctl start php8.3-fpm
Теперь ваша служба должна запуститься без проблем. Проверьте статус:
systemctl status php8.3-fpm
3) Почему это происходит
Если PHP-FPM аварийно завершает работу или неожиданно завершается, он может оставить за собой работающий дочерний процесс или устаревший сокет. Systemd пытается запустить новый мастер-процесс, но сокет уже занят.
4) Предотвратите это в будущем
- Корректные перезапуски: Предпочитайте
systemctl reload php8.3-fpm
для изменений конфигурации. - Отслеживайте журналы: Следите за
/var/log/php8.3-fpm.log
(или путем вашей дистрибуции) на предмет сбоев. - Сокет против порта: Если вы постоянно сталкиваетесь с конфликтами сокетов, рассмотрите временно использование TCP (127.0.0.1:9000) во время отладки.
Быстрый чек-лист для копирования и вставки
# 1) Проверка конфигурации
sudo php-fpm8.3 -t
# 2) Анализ журналов службы
sudo journalctl -xeu php8.3-fpm.service
# 3) Если ошибка "already listen" -> освободите сокет
sudo lsof /var/run/php/your-socket-name.sock
sudo kill <PID>
sudo rm /var/run/php/your-socket-name.sock
# 4) Запуск службы
sudo systemctl start php8.3-fpm
# 5) Проверка
systemctl status php8.3-fpm