#Симптом и границы применимости
После перезапуска Nginx перестаёт подключаться к Unix-сокету приложения и возвращает 502; до перезапуска запросы работали. У Nginx и PHP-FPM разные сокеты и владельцы: перед исправлением определите, кто создаёт файл, кто к нему подключается и не исчез ли путь /run.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Сокет ещё не созданПри загрузке FPM может стартовать позже или создать сокет с другим именем. | В error_log connect() failed (2: No such file or directory) | Сравнить пути fastcgi_pass и listen PHP-FPM |
| Нет прав на соединениеДоступ к сокету контролируется правами на сокет и доступом к родительскому каталогу. | В журнале connect() failed (13: Permission denied) | Проверить пользователя Nginx, владельца сокета и каталоги |
| Путь в временном каталоге исчезВременное файловое дерево очищается после перезагрузки. | После перезагрузки отсутствует каталог внутри /run | Проверить создание runtime-каталога и службу FPM |
#Пошаговая диагностика и исправление
- Уточните точную ошибку 502Откройте SSH на том сервере, где работает Nginx. Запросите проблемный адрес, затем посмотрите последние строки error_log: в панели узнайте путь, а при обычной установке это часто /var/log/nginx/error.log. Различайте No such file и Permission denied — исправления у них разные.
- Пример пути для обычной установки; при иной конфигурации используйте путь из error_logLinux · Терминал (Bash)КомандаНужен sudoПример пути для обычной установки; при иной конфигурации используйте путь из error_log.
sudo tail -n 80 /var/log/nginx/error.log
- Узнайте, какой путь ожидает NginxВ полной конфигурации найдите fastcgi_pass unix:/… или proxy_pass http://unix:/… и выпишите полный путь. Посмотрите, не обращается ли часть location к другому пулу. Не заменяйте сокет на TCP без понимания прав и схемы доступа.Linux · Терминал (Bash)КомандаНужен sudonginx -T показывает активные include; не распространяйте секреты из полного вывода.
sudo nginx -T 2>&1 | grep -nE "fastcgi_pass|proxy_pass|error_log"
- Проверьте создателя сокетаСверьте путь с директивой listen конкретного PHP-FPM-пула. Название службы зависит от версии и панели, например php8.2-fpm или php8.5-fpm; не предполагайте одно имя. Проверьте сокеты, доступные в системе. Если путь отсутствует, сначала выясните состояние соответствующего FPM.
- Дополнительная команда по темеLinux · Терминал (Bash)КомандаНужен sudoUnix-сокеты выводятся в формате LISTEN; отсутствие процесса FPM — причина для диагностики его службы.
sudo ss -xlpn | grep -E "php|fpm|nginx"
- Проверьте владельца и проход по каталогамНа SSH-сервере подставьте путь сокета из предыдущего шага. Команда namei показывает каждый каталог; ls -l — файл. Узнайте рабочую учётную запись Nginx по user в nginx -T или по процессам, а у FPM параметры listen.owner, listen.group и listen.mode. Не назначайте всем каталогам 777.Linux · Терминал (Bash)КомандаПример пути, замените фактическим; только чтение.
namei -l /run/php/php8.2-fpm.sock; ls -l /run/php/php8.2-fpm.sock
- Восстановите правильное создание сокетаЕсли путь не совпадает, исправьте один параметр в конфигурации пула либо fastcgi_pass после резервной копии; если ошибка в правах, настройте listen.owner/listen.group/listen.mode согласно фактической группе процесса. Для несуществующего /run каталога проверьте RuntimeDirectory или tmpfiles.d службы, а не создавайте его вручную после каждой загрузки.
- Проверьте конфигурации и запускайте в зависимости от службыСначала проверьте тест Nginx. У PHP-FPM синтаксический тест запускается бинарником установленной версии (
php-fpm8.2 -t— лишь пример). Перечитывание Nginx не исправляет отказ самого FPM: используйте систему управления службой соответствующей версии, когда подтверждены исправления.Linux · Терминал (Bash)С осторожностьюНужен sudoКоманда не перезапускает FPM. Сохраните конфигурацию, подготовьте откат; изменение прав и пула влияет на приложения.sudo nginx -t && sudo systemctl reload nginxКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
После перезапуска обеих соответствующих служб (в согласованное окно) проверьте существование сокета, права, HTTP-код проблемного URL и отсутствие новых connect() failed в error_log.
#Если проблема не устранена
Если сокет есть и доступен, но 502 сохраняется, изучите ошибки upstream prematurely closed connection и логи PHP-FPM; не меняйте права системных каталогов рекурсивно.