502 Bad Gateway в Nginx: диагностика и руководство по решению
Что такое ошибка "502 Bad Gateway"
Ошибка 502 Bad Gateway — стандартный код состояния HTTP, сигнализирующий о том, что сервер в роли шлюза или прокси получил некорректный ответ от вышестоящего сервера. В случае с Nginx ошибка означает сбой связи между веб-сервером и внутренними сервисами: PHP-FPM, Apache, прикладными серверами или базами данных.
Техническое определение согласно стандарту
Спецификация RFC 7231 (раздел 6.6.3) определяет статус 502 (Bad Gateway) как ситуацию, когда сервер-шлюз или прокси получает недействительный ответ от входящего сервера. Статус является фатальным для клиентского запроса и требует вмешательства на стороне инфраструктуры.
Внешнее проявление для пользователя
При возникновении сбоя браузер отображает стандартную страницу Nginx:

Сообщение об ошибке носит общий характер. Начиная с версии 1.18.0, Nginx унифицировал страницы ошибок класса 5xx, что ещё больше уменьшило их информативность для диагностики.
HTML-код страниц ошибок в разных версиях Nginx
Анализ HTML-кода страниц ошибок помогает понять, как Nginx взаимодействует с пользователем при возникновении сбоя. Знание структуры этих страниц полезно для:
- Диагностики — определение версии Nginx по виду страницы ошибки
- Кастомизации — создание собственных информативных страниц для пользователей
- Отладки — понимание, какая именно конфигурация отвечает за отображение ошибок
В разных версиях Nginx подход к отображению ошибок менялся: от отдельных минималистичных шаблонов для каждого кода состояния до унифицированных страниц для всех ошибок класса 5xx.
Классическая страница ошибки 502 (версии до 1.18.0)
До версии 1.18.0 Nginx использовал отдельные HTML-шаблоны для каждой ошибки. Код страницы 502 Bad Gateway был минималистичным:
<html>
<head><title>502 bad gateway</title></head>
<body>
<center><h1>502 bad gateway</h1></center>
<hr><center>nginx/1.18.0 (ubuntu)</center>
</body>
</html>Особенности:
- Заголовок
<title>содержит точный код ошибки - Тело страницы включает только код ошибки и версию Nginx
- Отсутствуют пояснения для пользователя
Унифицированная страница ошибок (версии 1.18.0 и выше)
Современные версии Nginx используют единый шаблон для всех ошибок класса 5xx, что упрощает поддержку, но снижает информативность:
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the error log for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>Ключевые изменения:
- Универсальный заголовок
<title>Error</title>вместо конкретного кода - Добавлена адаптивная цветовая схема
(color-scheme: light dark) - Появилось пояснение для администраторов о необходимости проверки логов
- Сохранён фирменный стиль Nginx
Как кастомизировать страницу ошибки 502
Для улучшения пользовательского опыта рекомендуется создать собственную страницу ошибки. Пример минимальной кастомизации:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>502 - Ошибка сервера</title>
<style>
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
.container { max-width: 600px; margin: 0 auto; }
h1 { color: #d9534f; }
.actions { margin-top: 30px; }
</style>
</head>
<body>
<div class="container">
<h1>502 - Временные неполадки на сервере</h1>
<p>Сервер временно не может обработать ваш запрос.</p>
<p>Мы уже работаем над решением проблемы.</p>
<div class="actions">
<a href="/">На главную</a> •
<a href="javascript:location.reload()">Обновить страницу</a>
</div>
</div>
</body>
</html>
Диагностика через журналы сервера
Для определения причины необходимо обратиться к журналу ошибок Nginx: /var/log/nginx/error.log (Подробнее о работе с логами Nginx читайте в официальной документации). Типичная запись при ошибке 502:
2023/04/04 08:34:43 [error] 949#949: *7 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.1.1, server: example.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "example.com"Ключевые элементы записи:
| Элемент лога | Значение |
|---|---|
connect() failed | Сбой установки TCP-соединения с бэкенд-сервером. |
(111: Connection refused) | Код ошибки ОС (ECONNREFUSED). Указывает на недоступность сервиса на целевом порту. |
upstream: "http://127.0.0.1:8080/" | Адрес и порт сервера, к которому Nginx пытался обратиться. |
client: 192.168.1.1 | IP-адрес клиента, отправившего запрос. |
Архитектурный контекст в Nginx
Nginx часто функционирует как обратный прокси или балансировщик нагрузки, перенаправляя клиентские запросы на внутренние серверы приложений (upstream servers). Ошибка 502 возникает, когда Nginx не может установить связь с upstream-сервером или получает от него невалидный HTTP-ответ.
Типичный сценарий:
Клиент → [Запрос] → Nginx (прокси) → [Попытка соединения] → Бэкенд-сервис
↑
[Сбой: 502 Bad Gateway]Ошибка 502 Bad Gateway указывает на проблему не в самом Nginx, а в инфраструктуре серверных приложений. Следующие разделы посвящены систематическому анализу основных причин этой ошибки и методам их устранения.
Теперь, имея представление о природе ошибки 502, рассмотрим конкретные причины её возникновения и способы устранения.
Причины возникновения и решения ошибки "502 Bad Gateway"
Ошибка 502 Bad Gateway возникает при нарушении коммуникации между Nginx и вышестоящими сервисами. Для систематического устранения проблемы необходимо последовательно проверить пять основных категорий сбоев.
Сбой серверной службы
Nginx функционирует как интерфейс между клиентом и серверными службами: PHP-FPM, базами данных, кэширующими серверами и другими прикладными сервисами. Прекращение работы любого из этих компонентов приводит к ошибке 502.
Наиболее уязвимые службы:
- PHP-FPM (менеджер процессов PHP)
- Apache (при использовании в связке с Nginx)
- Серверы кэширования (Redis, Memcached)
- Системы управления базами данных (MySQL, PostgreSQL)
Возможные причины сбоя:
- Внезапные пики нагрузки
- Исчерпание системных ресурсов (память, процессор)
- Аппаратные сбои дисковых систем
- Целенаправленные DDoS-атаки
Процедура восстановления:
При подозрении на сбой службы необходимо:
- Проверить статус сервиса
- Завершить зависшие процессы
- Выполнить перезапуск
Пример для PHP-FPM:
Возможно потребуется указать конкретную версию, например php8.5-fpm.
systemctl status php-fpm # проверка статуса
pkill -9 php-fpm # принудительное завершение
systemctl restart php-fpm # перезапуск службыВысокая нагрузка на сервер
Чрезмерная нагрузка на серверные ресурсы — вторая по распространённости причина ошибок 502. При превышении лимитов производительности службы перестают отвечать на запросы.
Источники повышенной нагрузки:
| Категория | Конкретные примеры |
|---|---|
| Легитимный трафик | Сезонные всплески активности, рекламные кампании, вирусные материалы |
| Вредоносная активность | Вирусы, трояны, криптомайнеры, сканеры уязвимостей |
| Атаки на приложение | Брутфорс-атаки, спам в формах комментариев, эксплуатация уязвимостей |
| Ошибки приложения | Утечки памяти, бесконечные циклы, неоптимальные запросы к БД |
Методика диагностики:
Мониторинг ресурсов — определение узкого места:
top # общая нагрузка CPU
free -h # использование памяти
iostat -x 1 10 # статистика ввода-вывода
nethogs # сетевая активность по процессамИдентификация процессов — определение источника нагрузки:
ps aux --sort=-%cpu | head -10 # процессы по CPU
ps aux --sort=-%mem | head -10 # процессы по памятиАнализ логов — поиск паттернов атак или ошибок:
tail -f /var/log/nginx/access.log | grep -E "(502|500|404)"
Неправильная конфигурация сервиса
Nginx и сопутствующие службы зависят от корректности множества конфигурационных параметров. Ошибка в любом из конфигурационных файлов может привести к невозможности обработки запросов.
Типичные проблемы конфигурации:
- DNS resolver в Nginx — неправильные настройки разрешения имён
- Параметры подключения к БД — изменённые после миграции логины или пароли
- Настройки брандмауэра Apache — синтаксические ошибки в
mod_security - Ограничения PHP — некорректные значения
memory_limit,max_execution_time - Лимиты соединений — чрезмерно строгие ограничения
max_connections
Пример диагностики через логи:
Помимо логов Nginx, стоит также проверить логи самих сервисов, например PHP-FPM:
WARNING: [domain.com] server reached max_children setting (30), consider raising it
ERROR: unable to read what child say: Bad file descriptor (9)Порт сервиса заблокирован в брандмауэре
Брандмауэры обеспечивают базовую безопасность сервера, но неправильная их настройка может блокировать легитимные соединения между службами.
Типичный сценарий:
В связке Nginx + Apache (например, в панели управления Plesk) Nginx использует порт 80, а Apache — порт 7080. Стандартные правила брандмауэра часто блокируют нестандартные порты, что препятствует коммуникации между серверами. Список стандартных портов услуг поддерживается IANA.
Процедура диагностики:
Определение активных портов:
netstat -tulpn | grep LISTEN
ss -tulpn # альтернативная командаПроверка правил брандмауэра:
iptables -L -n -v # для iptables
firewall-cmd --list-all # для firewalld
ufw status numbered # для UFWРешение проблемы:
- Изменение конфигурации службы на стандартный порт
- Добавление исключения в правила брандмауэра
- Настройка проброса портов (port forwarding)
Ошибки веб-приложений
В редких случаях ошибка 502 возникает из-за несовместимости прикладного кода с версией Nginx или его модулей.
Индикаторы проблем с приложением:
Сегментация памяти в логах:
[notice] child pid 27831 exit signal Segmentation fault (11)Несовместимость версий — использование устаревших функций PHP или несовместимых библиотек
Конфликты расширений — проблемы с Opcache, APCU или другими модулями ускорения
Процедура устранения:
- Проверка требований приложения к версиям ПО
- Тестирование с отключёнными кэширующими модулями
- Анализ логов приложения на предмет фатальных ошибок
- Постепенное обновление компонентов стека с тестированием после каждого изменения
Заключение и рекомендации
Ошибка 502 Bad Gateway в Nginx свидетельствует о нарушении коммуникации между веб-сервером и вышестоящими службами. Систематический подход к диагностике и устранению этой ошибки основан на проверке пяти ключевых направлений:
Основные причины и приоритетность проверки
- Сбой серверных служб — наиболее вероятная причина
- Проверить статус PHP-FPM, Apache, серверов БД и кэширования
- Выполнить перезапуск зависших служб
- Проанализировать логи на предмет аварийных завершений
- Чрезмерная нагрузка на ресурсы — вторая по распространённости причина
- Определить узкое место (CPU, память, I/O, сеть)
- Выявить процессы с аномальным потреблением ресурсов
- Проанализировать трафик на признаки DDoS или вредоносной активности
- Ошибки конфигурации — требуют детального анализа настроек
- Проверить корректность всех конфигурационных файлов
- Убедиться в совместимости версий ПО
- Верифицировать параметры подключения к зависимым службам
- Блокировка брандмауэром — часто возникает после обновлений или миграций
- Проверить доступность портов вышестоящих служб
- Аудитировать правила брандмауэра
- Убедиться в отсутствии конфликтов между сетевыми политиками
- Проблемы прикладного кода — наименее вероятная, но возможная причина
- Проверить совместимость версий приложения и серверного ПО
- Проанализировать логи на предмет сегментации памяти
- Тестировать с отключёнными оптимизирующими модулями
Алгоритм быстрой диагностики
Для оперативного восстановления работы рекомендуется следующая последовательность действий:
Проверка доступности служб:
systemctl status nginx php-fpm mysql # или соответствующие службыАнализ журналов ошибок:
tail -50 /var/log/nginx/error.log
tail -50 /var/log/php-fpm/error.log # если применимоМониторинг ресурсов:
top -bn1 | head -20 # нагрузка CPU и памяти
netstat -tulpn | grep -v LISTEN # сетевые соединенияПроверка конфигурации:
nginx -t # проверка синтаксиса конфигурации Nginx
Профилактические меры
Для предотвращения повторного возникновения ошибки 502 рекомендуется:
- Регулярное обновление ПО и применение патчей безопасности
- Мониторинг ресурсов с настройкой алертов при достижении критических значений
- Резервирование мощностей с запасом 20-30% для обработки пиковых нагрузок
- Периодический аудит конфигураций и правил безопасности
- Тестирование отказоустойчивости перед развёртыванием изменений
Дополнительные материалы
Для углублённого изучения смежных тем рекомендуем: