Nginx 502: php-fpm.sock failed (No such file or directory) — Решение
Веб-сервер не может обнаружить сокет-файл интерпретатора PHP. В браузере выводится 502 Bad Gateway, а в журнале ошибок: connect() to unix:/var/run/php/php-fpm.sock failed (2: No such file or directory) while connecting to upstream.
| Конфигурация Nginx | Реальное состояние ФС | Суть проблемы |
|---|---|---|
unix:/var/run/php/php7.4-fpm.sock | Установлен PHP 8.2 (php8.2-fpm.sock) | Устаревший путь после обновления версии PHP |
unix:/run/php-fpm/www.sock | Служба php-fpm остановлена | Файл сокета удален при остановке демона |
Директория /run/php/ | Каталог удален после перезагрузки ОС | Временная файловая система tmpfs очистила папку |
- Посетители получают мгновенную ошибку 502 при запросе любых
.phpстраниц. - Статические файлы (css, js, png) отдаются веб-сервером корректно.
- Проверьте фактический статус службы PHP-FPM:
sudo systemctl status php*-fpm # Если служба выключена, запустите ее: sudo systemctl start php8.2-fpm sudo systemctl enable php8.2-fpm - Найдите реальный путь к сокет-файлу в файловой системе:
sudo find /run /var/run -name "*fpm*.sock" - Проверьте директиву
listenв конфигурации пула PHP (/etc/php/8.x/fpm/pool.d/www.conf):grep "^listen =" /etc/php/*/fpm/pool.d/www.conf - Приведите строку
fastcgi_passв конфигурационном блокеserverNginx к найденному пути:location ~ \.php$ { include snippets/fastcgi-php.conf; # Укажите точный путь: fastcgi_pass unix:/run/php/php8.2-fpm.sock; } - Проверьте конфигурацию Nginx на синтаксические ошибки и перезапустите:
sudo nginx -t sudo systemctl reload nginx
/run смонтирован как tmpfs в оперативной памяти и очищается при каждой перезагрузке сервера. Убедитесь, что systemd-юнит PHP-FPM содержит директиву RuntimeDirectory=php для автоматического пересоздания структуры папок.Частые вопросы (FAQ)
Почему сокет исчезает после каждой перезагрузки сервера?
Потому что директория /run/php удаляется из RAM при выключении. PHP-FPM должен автоматически создавать ее через systemd механизм RuntimeDirectory=php или tmpfiles.d.
Как переключить Nginx на работу через TCP-порт вместо сокета?
В www.conf укажите 'listen = 127.0.0.1:9000', а в конфигурации Nginx задайте 'fastcgi_pass 127.0.0.1:9000;'.
Почему после apt upgrade сайт выдает ошибку сокета 502?
Обновление установило новую версию PHP (например, с 8.1 на 8.2), создало новый сокет php8.2-fpm.sock, а Nginx продолжает обращаться к старому сокету php8.1-fpm.sock.
Как запустить PHP-FPM с созданием сокета в кастомном месте?
Отредактируйте директиву listen в pool.d/www.conf, указав полный путь, и перезапустите php-fpm.