Как исправить зависшую службу 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