Ошибка 502 Bad Gateway: причины и способы устранения¶
502 Bad Gateway — код состояния HTTP, обозначающий, что сервер-шлюз или прокси-сервер получил недопустимый ответ от вышестоящего (внутреннего) сервера. Ошибка относится к классу серверных ошибок 5xx и указывает на сбой коммуникации между двумя компонентами инфраструктуры, а не на проблему на стороне клиента. Появляется в браузере в виде страницы с текстом «502 Bad Gateway» или «502 Bad Gateway — nginx».
¶Природа ошибки
Код 502 определён в стандарте RFC 7231 (секция 6.6.3). Согласно спецификации, 502 означает, что сервер, выступающий в роли шлюза или прокси, получил от upstream-сервера ответ, который не смог интерпретировать. Типичная цепочка запроса выглядит так:
- Клиент (браузер) отправляет запрос к домену.
- Запрос принимает внешний сервер — обычно nginx, Apache, балансировщик нагрузки или CDN.
- Шлюз пересылает запрос на внутреннее приложение (backend) — например, PHP-FPM, Node.js-процесс, Gunicorn, uWSGI.
- Если backend не отвечает, отвечает с некорректным форматом или обрывает соединение — шлюз возвращает клиенту 502.
Таким образом, ошибка почти всегда означает проблему между проксирующим сервером и backend-приложением.
¶Основные причины
¶Недоступность backend-процесса
Наиболее частая причина. Приложение-обработчик упало, не запустилось после перезагрузки или было убито по нехватке памяти. Примеры: остановлен сервис php-fpm, завершился процесс Gunicorn, упал веб-сервер Tomcat.
¶Переполнение пула процессов или очереди
Если пул воркеров (например, php-fpm pool) исчерпан, а очередь запросов переполнена, новые соединения отклоняются, и nginx возвращает 502. Аналогичная ситуация возникает при исчерпании лимита соединений на стороне backend.
¶Таймауты
Если приложение обрабатывает запрос дольше, чем отведено таймаутом прокси (параметры proxy_read_timeout, proxy_connect_timeout в nginx), соединение разрывается и клиент получает 502. Таймауты могут быть вызваны медленными запросами к базе данных, внешним API или сложными вычислениями.
¶Ошибки конфигурации
Некорректно указанный адрес backend (proxy_pass http://127.0.0.1:8080` при том, что приложение слушает другой порт), неправильные заголовки, несовместимые версии протоколов между прокси и backend.
¶Проблемы с сетью и DNS
Разрыв соединения между прокси и backend, блокировка портов файрволом, нерабочий DNS-запрос при попытке разрешить имя внутреннего сервера.
¶Перегрузка сервера
Высокая загрузка CPU, исчерпание оперативной памяти, переполнение диска (в частности, логами) приводят к тому, что backend перестаёт отвечать вовремя.
¶Сбои в CDN и балансировщиках
При использовании Cloudflare, AWS ELB, Google Cloud Load Balancing ошибка 502 может генерироваться самим балансировщиком, если ни один из бэкендов недоступен или не прошёл health check.
¶Диагностика
Первый шаг — проверка логов. В nginx ошибки записываются в /var/log/nginx/error.log и обычно содержат конкретную причину: «connect() failed», «upstream prematurely closed connection», «no live upstreams». Логи backend-приложения (журналы PHP, системный journalctl -u myapp, логи приложения) уточняют, что происходило на стороне обработчика.
Полезные команды:
systemctl status <сервис>— проверка состояния backend-сервиса;ss -tlnpилиnetstat -tlnp— проверка, слушает ли процесс нужный порт;curl -I http://127.0.0.1:8080` — прямой запрос к backend мимо прокси;df -hиfree -m— проверка диска и памяти;tail -f /var/log/nginx/error.log— наблюдение ошибок в реальном времени.
¶Способы устранения
¶Перезапуск сервисов
systemctl restart nginx php-fpm — базовое действие, часто решающее проблему, если процесс просто завис.
¶Увеличение таймаутов
В конфигурации nginx:
`` proxy_connect_timeout 60s; proxy_read_timeout 120s; proxy_send_timeout 120s; ``
¶Расширение пула воркеров
В www.confpm.max_children для php-fpm увеличиваются , pm.start_servers и связанные параметры. Для Gunicorn — число воркеров через параметр -w`.
¶Проверка конфигурации
nginx -t — проверка синтаксиса конфигурации перед перезагрузкой. Убедиться, что proxy_pass указывает на реальный адрес и порт backend.
¶Освобождение ресурсов
Очистка логов, расширение диска, настройка ротации через logrotate, оптимизация запросов к базе данных, кэширование тяжёлых операций.
¶Health check и автоперезапуск
Настройка мониторинга (Monit, systemd Restart=always, supervisord) для автоматического восстановления упавших процессов.
¶Если ошибка на стороне стороннего сайта
Когда 502 возвращается чужим сервисом, на стороне пользователя доступные действия ограничены: обновить страницу, очистить кэш DNS (ipconfig /flushdns в Windows, sudo systemd-resolve --flush-caches в Linux), временно отключить VPN или прокси, попробовать другую сеть. Дальнейшее устранение — задача администратора ресурса.
¶Источники
- RFC 7231 — Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
- Документация nginx: директивы модуля ngx_http_proxy_module
- Документация PHP: настройка пула PHP-FPM
- Документация Cloudflare: HTTP error codes
