Если Nginx не может подключиться к PHP-FPM через Unix-сокет, сайт часто перестаёт выполнять PHP и начинает возвращать 502 Bad Gateway.
В журнале Nginx при этом можно увидеть ошибку, связанную с подключением к файлу вида:
/run/php/php8.3-fpm.sockили:
/run/php-fpm/www.sockГлавное — не начинать с перезапуска всего сервера или выдачи прав 777.
Сначала нужно понять, существует ли сокет, слушает ли его PHP-FPM и совпадает ли этот путь с настройкой Nginx.
PHP-FPM действительно поддерживает работу через Unix-сокеты, а Nginx позволяет передавать FastCGI-запросы на сокет через fastcgi_pass unix:....
Сначала найдите путь, который использует Nginx
↑ К оглавлениюПосмотрите итоговую конфигурацию Nginx:
nginx -TНайдите директиву:
fastcgi_passНапример:
fastcgi_pass unix:/run/php/php8.3-fpm.sock;Или PHP-FPM может быть подключён через TCP:
fastcgi_pass 127.0.0.1:9000;Это два разных способа подключения.
Официальная документация Nginx прямо допускает в fastcgi_pass как адрес и порт, так и путь Unix-сокета.
Если используется Unix-сокет, сохраните точный путь из конфигурации. Именно его дальше нужно сравнивать с настройкой PHP-FPM.
Проверьте, какой сокет создаёт PHP-FPM
↑ К оглавлениюУ каждого пула PHP-FPM есть параметр:
listen =Например:
listen = /run/php/php8.3-fpm.sockили:
listen = 127.0.0.1:9000PHP-FPM позволяет разным пулам слушать разные сокеты или порты. Это одна из штатных возможностей FPM.
Точный путь к файлам конфигурации зависит от системы и способа установки PHP.
Часто конфигурации пулов находятся в каталогах вроде:
/etc/php/8.x/fpm/pool.d/или:
/etc/php-fpm.d/Но не подставляйте путь из примера вслепую.
Нужно найти фактический параметр listen на конкретном сервере.
Пути Nginx и PHP-FPM должны совпадать
↑ К оглавлениюДопустим, в Nginx указано:
fastcgi_pass unix:/run/php/php8.2-fpm.sock;а PHP-FPM настроен так:
listen = /run/php/php8.3-fpm.sockВ таком случае Nginx пытается подключиться совсем не туда, где слушает PHP-FPM.
Это часто возникает после:
- смены версии PHP;
- установки новой версии PHP-FPM;
- удаления старой версии;
- изменения конфигурации пула;
- переноса конфигурации с другого сервера.
Исправлять нужно не «сокет вообще», а привести обе стороны к одному реальному адресу:
Nginx → тот же socket/port ← PHP-FPM.
Если сокета вообще нет
↑ К оглавлениюПроверьте сам файл:
ls -l /run/php/или конкретный путь:
ls -l /run/php/php8.3-fpm.sockЕсли файла нет, возможны несколько причин:
- PHP-FPM не запущен;
- нужный пул не запустился;
- используется другой путь;
- используется другая версия PHP;
- FPM работает через TCP, а Nginx ждёт Unix-сокет;
- конфигурация PHP-FPM содержит ошибку.
Сначала определите, какой именно PHP-FPM установлен и запущен.
Не стоит сразу создавать пустой файл .sock вручную. Unix-сокет создаётся работающим процессом PHP-FPM, а обычный файл с таким именем проблему не решит.
Проверьте, работает ли PHP-FPM
↑ К оглавлениюНа серверах с systemd сначала найдите фактический сервис PHP-FPM, потому что его имя зависит от системы и установленной версии PHP.
Например, можно посмотреть список сервисов:
systemctl list-units --type=service | grep -i fpmПосле этого проверить найденный сервис:
systemctl status ИМЯ_СЕРВИСАЕсли PHP-FPM не запущен, сначала нужно выяснить причину его остановки.
Не ограничивайтесь командой restart.
Если FPM не может стартовать из-за неправильной конфигурации, простой перезапуск снова закончится той же ошибкой.
Проверьте конфигурацию PHP-FPM перед перезапуском
↑ К оглавлениюPHP-FPM поддерживает тест конфигурации через параметр -t.
В зависимости от установки бинарный файл может называться, например:
php-fpmили содержать номер версии.
Используйте фактический бинарный файл своего PHP-FPM, а не случайную команду из инструкции для другого дистрибутива.
Если проверка показывает ошибку, сначала исправьте конфигурацию и только затем перезапускайте сервис.
Если сокет существует, проверьте права
↑ К оглавлениюДругой распространённый случай: файл сокета существует, но Nginx не имеет права к нему подключиться.
Посмотрите:
ls -l /run/php/php8.3-fpm.sockДля Unix-сокетов PHP-FPM существуют специальные настройки:
listen.owner
listen.group
listen.modeНапример:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660Это только пример — нужный пользователь и группа зависят от сервера.
Официальная документация PHP указывает, что в Linux веб-серверу необходимы права чтения и записи на Unix-сокет; эти права как раз задаются параметрами listen.owner, listen.group и listen.mode.
Поэтому решение:
chmod 777 ...не является нормальной диагностикой.
Нужно определить, от какого пользователя работает Nginx, и настроить доступ PHP-FPM корректно.
Не забудьте про ACL
↑ К оглавлениюPHP-FPM также поддерживает:
listen.acl_users
listen.acl_groupsЕсли для сокета настроены POSIX ACL, параметры listen.owner и listen.group могут игнорироваться.
Поэтому ситуация:
> owner и group выглядят правильно, но доступ всё равно работает не так, как ожидается
требует проверки полной конфигурации пула, а не только одной строки listen.mode.
Если ошибка появилась после обновления PHP
↑ К оглавлениюЭто особенно характерный сценарий.
Допустим, раньше сервер использовал:
/run/php/php8.2-fpm.sockпосле обновления работает:
/run/php/php8.3-fpm.sockа в конфигурации Nginx осталась старая версия.
Тогда PHP-FPM может быть полностью исправен, но Nginx продолжит обращаться к несуществующему сокету.
Порядок проверки:
- посмотреть
fastcgi_passв Nginx; - посмотреть
listenв активном FPM-пуле; - сравнить пути;
- проверить существование сокета;
- только потом менять конфигурацию.
Не угадывайте номер версии PHP по памяти.
Если используется TCP, сокет искать не нужно
↑ К оглавлениюИногда PHP-FPM настроен так:
listen = 127.0.0.1:9000а Nginx:
fastcgi_pass 127.0.0.1:9000;Это штатная схема.
В таком случае отсутствие .sock вообще не является проблемой.
PHP-FPM поддерживает прослушивание TCP, а для TCP также существует параметр listen.allowed_clients, ограничивающий клиентов FastCGI.
Поэтому сначала всегда определяйте фактическую схему подключения:
Unix socket или TCP.
Если файл есть, но соединение всё равно не устанавливается
↑ К оглавлениюСам факт наличия .sock ещё не доказывает, что через него сейчас нормально принимает соединения рабочий PHP-FPM.
Нужно проверить:
- запущен ли FPM;
- активен ли нужный pool;
- совпадает ли socket path;
- корректны ли права;
- нет ли ошибки в журнале PHP-FPM;
- не остался ли путь от старой версии PHP.
Полезнее искать причину в связке:
Nginx
↓
fastcgi_pass
↓
Unix socket / TCP
↓
PHP-FPM poolа не диагностировать каждый компонент отдельно.
Проверьте журнал PHP-FPM
↑ К оглавлениюPHP-FPM имеет собственный журнал ошибок. Путь задаётся параметром error_log в конфигурации FPM.
Если сервис не стартует или пул создаётся неправильно, журнал может сразу показать:
- ошибку конфигурации;
- проблему с пользователем или группой;
- невозможность создать listener;
- конфликт адреса;
- другую причину остановки.
Это намного полезнее, чем многократно перезапускать сервис.
Проверьте Nginx после изменений
↑ К оглавлениюПеред применением изменений конфигурации Nginx проверьте её:
nginx -tЕсли конфигурация корректна, примените её штатным способом для вашего сервера.
После этого снова откройте сайт и проверьте журнал ошибок.
Не меняйте одновременно Nginx, PHP-FPM, права и версию PHP. Иначе после восстановления сайта будет сложно понять, что именно было причиной.
А если проблема не в сокете, а PHP-FPM перегружен?
↑ К оглавлениюБывает и другой случай: соединение настроено правильно, но PHP-FPM не успевает обрабатывать запросы.
PHP-FPM имеет status page, где можно увидеть:
listen queue;- активные процессы;
- idle-процессы;
- общее количество процессов;
max children reached;- slow requests.
Эти показатели позволяют отличить проблему подключения от нехватки рабочих процессов.
Но это уже следующий этап.
Если Nginx вообще не может подключиться к указанному Unix-сокету, сначала исправляется именно соединение.
Короткий порядок диагностики
↑ К оглавлениюПри PHP-FPM sock failed я бы проверял так:
- посмотреть точную ошибку Nginx;
- найти фактический
fastcgi_pass; - определить — используется Unix-сокет или TCP;
- найти
listenактивного PHP-FPM pool; - сравнить адреса;
- проверить, существует ли socket;
- проверить статус PHP-FPM;
- проверить конфигурацию FPM;
- проверить
listen.owner,listen.groupиlisten.mode; - посмотреть журнал PHP-FPM;
- проверить конфигурацию Nginx;
- применить изменения;
- повторно открыть сайт и проверить ошибки.
Так можно локализовать проблему, а не перезапускать всё подряд.
Чего не стоит делать
↑ К оглавлениюПри ошибке подключения к PHP-FPM не стоит сразу:
- ставить
777на сокет и каталоги; - создавать
.sockобычной командойtouch; - менять номер версии PHP наугад;
- перезапускать весь сервер;
- переустанавливать PHP;
- переводить Unix-сокет на TCP без причины;
- менять одновременно несколько конфигураций;
- считать любой
502 Bad Gatewayпроблемой PHP-FPM-сокета.
Сначала сравните фактический адрес в Nginx с фактическим listen PHP-FPM.
Частые вопросы
Что означает PHP-FPM sock failed?
Обычно это означает, что веб-сервер не смог установить соединение с PHP-FPM через настроенный Unix-сокет. Нужно проверить путь сокета, работу PHP-FPM и права доступа.
Почему после обновления PHP сайт начал отдавать 502?
Одна из возможных причин — Nginx продолжает использовать путь к сокету старой версии PHP-FPM. Нужно сравнить fastcgi_pass в Nginx с listen активного PHP-FPM pool.
Можно ли поставить chmod 777 на PHP-FPM socket?
Так делать не стоит. PHP-FPM позволяет задать владельца, группу и режим сокета через listen.owner, listen.group и listen.mode. В Linux веб-серверу нужно выдать именно необходимые права на подключение.
Как понять, что проблема не в сокете, а в нагрузке PHP-FPM?
Если соединение с FPM работает, но проблемы появляются под нагрузкой, можно проверить FPM status page. В ней доступны очередь соединений, активные процессы и показатель max children reached.
Нужна помощь с MySQL?
Поможем найти причину переполнения подключений, проверить сервер и приложение и восстановить стабильную работу базы данных.