nginx 502 Bad Gateway: connect() failed к приложению
Ошибка 502 означает, что nginx сам работает, но не смог получить ответ от приложения. В журнале nginx при этом есть строка с уровнем error, где написано, что именно не удалось: отказ соединения, отсутствующий сокет или отказ в доступе к нему.
Что это значит
Разбор идёт по тексту в скобках. (111: Connection refused) — приложение не слушает адрес. (2: No such file or directory) — указан unix-сокет, которого нет. (13: Permission denied) — сокет есть, но nginx не имеет права в него писать.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Приложение не запущено или упало
Самая частая причина. nginx продолжает работать и отдаёт 502 на каждый запрос.
-
Путь к сокету не совпадает
После обновления PHP имя сокета меняется вместе с версией (
php8.1-fpm.sockпротивphp8.3-fpm.sock), а в конфигурации nginx остаётся прежнее. -
Нет прав на запись в сокет
Владелец и права сокета задаются в описании пула php-fpm. Пользователь nginx должен иметь доступ — обычно через общую группу.
-
Приложение не успевает ответить
Если ответ идёт дольше
proxy_read_timeoutилиfastcgi_read_timeout, nginx прерывает ожидание. В журнале при этом будет «upstream timed out».
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Строка с причиной: текст в скобках определяет дальнейший разбор.
sudo tail -30 /var/log/nginx/error.logСуществует ли сокет приложения и по какому пути.
sudo ss -xln | grep -E "php|gunicorn|uwsgi"Куда nginx пытается обращаться по итоговой конфигурации.
sudo nginx -T 2>/dev/null | grep -E "proxy_pass|fastcgi_pass"Состояние службы приложения.
systemctl status php8.3-fpm --no-pager | head -8Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Самая частая причина. nginx продолжает работать и отдаёт 502 на каждый запрос.
- Как проверить
-
Посмотрите состояние службы приложения.
systemctl status php8.3-fpm --no-pager | head -8 sudo ss -xln | grep php
- Как исправить
- Запустите приложение и разберитесь с причиной его падения: 502 тут лишь симптом.
- Почему происходит
- После обновления PHP имя сокета меняется вместе с версией (
php8.1-fpm.sockпротивphp8.3-fpm.sock), а в конфигурации nginx остаётся прежнее.
- Как проверить
-
Сравните путь в nginx и фактический сокет.
sudo nginx -T 2>/dev/null | grep fastcgi_pass sudo ss -xln | grep php
- Как исправить
-
Приведите путь в конфигурации nginx к фактическому и перезагрузите настройки.
sudo nginx -t && sudo systemctl reload nginx
- Почему происходит
- Владелец и права сокета задаются в описании пула php-fpm. Пользователь nginx должен иметь доступ — обычно через общую группу.
- Как проверить
-
Проверьте доступ от пользователя nginx.
sudo -u www-data test -w /run/php/php8.3-fpm.sock && echo доступ есть || echo отказ ls -l /run/php/
- Как исправить
-
Задайте в описании пула
listen.ownerиlisten.groupсоответственно пользователю веб-сервера и перезапустите php-fpm.
- Почему происходит
- Если ответ идёт дольше
proxy_read_timeoutилиfastcgi_read_timeout, nginx прерывает ожидание. В журнале при этом будет «upstream timed out».
- Как проверить
-
Поищите строки про таймаут.
sudo tail -50 /var/log/nginx/error.log | grep -i timeout
- Как исправить
- Ускорьте приложение или поднимите таймаут осознанно: он защищает nginx от накопления зависших запросов.
Пример вывода
nginx не может подключиться к сокету php-fpm. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
2026/09/15 14:22:03 [crit] 1120#1120: *8 connect() to unix:/run/php/php8.1-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: <адрес>, server: example.org, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.1-fpm.sock:"
● php8.3-fpm.service - The PHP 8.3 FastCGI Process Manager
Active: active (running) since Mon 2026-09-15 08:00:01 MSK; 6h ago
Служба работает, но версия в пути другая: nginx ищет сокет 8.1, а работает 8.3. Это самый частый вид 502 после обновления PHP.
Связанные ошибки
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- php-fpm: server reached pm.max_children setting Пул php-fpm исчерпал рабочие процессы: сайт отвечает медленно или отдаёт 502. Как считать pm.max_children.
- nginx 403 Forbidden и Permission denied на файлы сайта nginx отдаёт 403: нет прав на файлы сайта, закрыт каталог по пути, мешает SELinux или AppArmor, нет индексного файла.
- nginx 504 Gateway Time-out: upstream timed out nginx не дождался ответа приложения. Разбор таймаутов proxy_read_timeout и fastcgi_read_timeout, поиск медленных мест.
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
- nginx: [emerg] host not found in upstream nginx не запускается: не разрешается имя узла из upstream или proxy_pass. Разбор порядка запуска и работы с именами.
Где встречается чаще всего
Источники
- Документация nginx: модуль proxy и таймауты
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено остановкой php-fpm и подменой версии в пути сокета.