Веб-сервер не соединяется с обработчиком PHP
Обработчик может слушать локальный сокет или порт, и веб-сервер должен обращаться тем же способом. Несовпадение даёт ошибку шлюза при полностью исправном обработчике — а после обновления пакета путь сокета иногда меняется вместе с номером версии.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Веб-сервер обращается к порту, а обработчик слушает сокет
Настройки указывают разные способы связи. Соединение не устанавливается.
-
Путь сокета изменился после обновления
Путь содержит номер версии обработчика. После обновления старый путь исчезает, а настройки веб-сервера остаются.
-
Права на сокет не дают доступа веб-серверу
Сокет создаётся с правами обработчика. Веб-сервер от другого пользователя получает отказ.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Слушает ли обработчик локальный сокет и какой.
sudo ss -xlnp | grep -i phpСуществующие сокеты обработчика и их права.
sudo ls -l /run/php/Что именно получает веб-сервер при обращении.
sudo journalctl -u nginx -n 20 --no-pager | grep -i "connect() to"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Настройки указывают разные способы связи. Соединение не устанавливается.
- Как проверить
-
Посмотрите, что слушает обработчик и куда обращается веб-сервер.
sudo ss -xlnp | grep -i php; sudo ss -tlnp | grep 9000 sudo grep -rhoE "fastcgi_pass [^;]+" /etc/nginx/ 2>/dev/null | head
- Как исправить
- Приведите обе настройки к одному способу. Локальный сокет быстрее и не занимает порт; порт нужен, когда обработчик на другой машине.
- Почему происходит
- Путь содержит номер версии обработчика. После обновления старый путь исчезает, а настройки веб-сервера остаются.
- Как проверить
-
Сравните существующие сокеты и путь в настройках.
sudo ls -l /run/php/ 2>/dev/null sudo grep -rhoE "unix:[^;]+" /etc/nginx/ 2>/dev/null | head
- Как исправить
- Обновите путь в настройках веб-сервера. Проверять это надо после каждого обновления основной версии обработчика.
- Почему происходит
- Сокет создаётся с правами обработчика. Веб-сервер от другого пользователя получает отказ.
- Как проверить
-
Посмотрите права сокета и пользователей.
sudo ls -l /run/php/php8.3-fpm.sock 2>/dev/null sudo grep -hE "^(listen.owner|listen.group|listen.mode)" /etc/php/*/fpm/pool.d/*.conf 2>/dev/null
- Как исправить
- Задайте владельца и режим доступа сокета в описании пула так, чтобы веб-сервер мог подключаться.
Пример вывода
Путь сокета изменился после обновления версии. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
nginx[12400]: 2026/09/15 19:48:11 [crit] 12400#0: *1 connect() to unix:/run/php/php8.2-fpm.sock failed (2: No such file or directory) while connecting to upstream
$ sudo ls /run/php/
php8.3-fpm.pid php8.3-fpm.sock
Связанные ошибки
- nginx 502 Bad Gateway: connect() failed к приложению nginx работает, а приложение недоступно: connect() failed, connection refused, no such file or directory для сокета. Разбор 502.
- php-fpm: ошибка в описании пула и отказ запуска php-fpm не запускается: неверный параметр в pool.d, несуществующий пользователь, недоступный путь сокета.
- Puma слушает сокет, а веб-сервер получает отказ доступа Разъём между приложением и веб-сервером: сокет создаётся с правами приложения, читает его другой пользователь.
- Apache: конфликт модулей многопроцессности и PHP Apache не запускается после включения модуля PHP: несовместимость с выбранным модулем многопроцессности.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- File exists при создании файла или сокета Ошибка 17: объект уже существует. Разбор для сокетов, файлов блокировки и каталогов службы.
- MySQL: Can't connect to local server through socket Клиент не находит unix-сокет MySQL: сервер не запущен, путь к сокету другой, каталог в /run не создан.
- libvirtd: служба выключена, но виртуальные машины управляются Служба в состоянии inactive, а команды работают: включена активация по сокету. Как это устроено и что включать.
Где встречается чаще всего
Источники
- Документация PHP-FPM: настройка пулов
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено обновлением версии обработчика без правки настроек веб-сервера.