502 Bad Gateway в Nginx: диагностика и руководство по решению

Ошибка 502 Bad Gateway возникает при нарушении коммуникации между Nginx и вышестоящими сервисами. В руководстве анализируем пять основных причин: сбои серверных служб, перегрузку ресурсов, ошибки конфигурации, блокировки брандмауэром и проблемы прикладного кода. Для каждой причины приводим методы диагностики и конкретные команды восстановления.

Что такое ошибка "502 Bad Gateway"

Ошибка 502 Bad Gateway — стандартный код состояния HTTP, сигнализирующий о том, что сервер в роли шлюза или прокси получил некорректный ответ от вышестоящего сервера. В случае с Nginx ошибка означает сбой связи между веб-сервером и внутренними сервисами: PHP-FPM, Apache, прикладными серверами или базами данных.

Техническое определение согласно стандарту

Спецификация RFC 7231 (раздел 6.6.3) определяет статус 502 (Bad Gateway) как ситуацию, когда сервер-шлюз или прокси получает недействительный ответ от входящего сервера. Статус является фатальным для клиентского запроса и требует вмешательства на стороне инфраструктуры.

Внешнее проявление для пользователя

При возникновении сбоя браузер отображает стандартную страницу Nginx:

Nginx Ошибка 502 Bad Gateway
Рис. 1. Стандартная страница ошибки 502 Bad Gateway в Nginx

Сообщение об ошибке носит общий характер. Начиная с версии 1.18.0, Nginx унифицировал страницы ошибок класса 5xx, что ещё больше уменьшило их информативность для диагностики.

HTML-код страниц ошибок в разных версиях Nginx

Анализ HTML-кода страниц ошибок помогает понять, как 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>

Особенности:

Унифицированная страница ошибок (версии 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>

Ключевые изменения:

Как кастомизировать страницу ошибки 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>
Кастомизированная страница ошибки 502 Bad Gateway в Nginx для улучшения UX
Рис. 2. Кастомизированная страница ошибки 502 Bad Gateway в Nginx для улучшения UX

Диагностика через журналы сервера

Для определения причины необходимо обратиться к журналу ошибок 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.1IP-адрес клиента, отправившего запрос.

Архитектурный контекст в 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.

Наиболее уязвимые службы:

Возможные причины сбоя:

Процедура восстановления:

При подозрении на сбой службы необходимо:

  1. Проверить статус сервиса
  2. Завершить зависшие процессы
  3. Выполнить перезапуск

Пример для PHP-FPM:

Возможно потребуется указать конкретную версию, например php8.5-fpm.

systemctl status php-fpm        # проверка статуса
pkill -9 php-fpm # принудительное завершение
systemctl restart php-fpm # перезапуск службы

Высокая нагрузка на сервер

Чрезмерная нагрузка на серверные ресурсы — вторая по распространённости причина ошибок 502. При превышении лимитов производительности службы перестают отвечать на запросы.

Источники повышенной нагрузки:

КатегорияКонкретные примеры
Легитимный трафикСезонные всплески активности, рекламные кампании, вирусные материалы
Вредоносная активностьВирусы, трояны, криптомайнеры, сканеры уязвимостей
Атаки на приложениеБрутфорс-атаки, спам в формах комментариев, эксплуатация уязвимостей
Ошибки приложенияУтечки памяти, бесконечные циклы, неоптимальные запросы к БД

Методика диагностики:

  1. Мониторинг ресурсов — определение узкого места:

    top                           # общая нагрузка CPU
    free -h # использование памяти
    iostat -x 1 10 # статистика ввода-вывода
    nethogs # сетевая активность по процессам
  2. Идентификация процессов — определение источника нагрузки:

    ps aux --sort=-%cpu | head -10    # процессы по CPU
    ps aux --sort=-%mem | head -10 # процессы по памяти
  3. Анализ логов — поиск паттернов атак или ошибок:

    tail -f /var/log/nginx/access.log | grep -E "(502|500|404)"

Неправильная конфигурация сервиса

Nginx и сопутствующие службы зависят от корректности множества конфигурационных параметров. Ошибка в любом из конфигурационных файлов может привести к невозможности обработки запросов.

Типичные проблемы конфигурации:

Пример диагностики через логи:

Помимо логов 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.

Процедура диагностики:

  1. Определение активных портов:

    netstat -tulpn | grep LISTEN
    ss -tulpn # альтернативная команда
  2. Проверка правил брандмауэра:

    iptables -L -n -v                  # для iptables
    firewall-cmd --list-all # для firewalld
    ufw status numbered # для UFW
  3. Решение проблемы:

    • Изменение конфигурации службы на стандартный порт
    • Добавление исключения в правила брандмауэра
    • Настройка проброса портов (port forwarding)

Ошибки веб-приложений

В редких случаях ошибка 502 возникает из-за несовместимости прикладного кода с версией Nginx или его модулей.

Индикаторы проблем с приложением:

  1. Сегментация памяти в логах:

    [notice] child pid 27831 exit signal Segmentation fault (11)
  2. Несовместимость версий — использование устаревших функций PHP или несовместимых библиотек

  3. Конфликты расширений — проблемы с Opcache, APCU или другими модулями ускорения

Процедура устранения:

  1. Проверка требований приложения к версиям ПО
  2. Тестирование с отключёнными кэширующими модулями
  3. Анализ логов приложения на предмет фатальных ошибок
  4. Постепенное обновление компонентов стека с тестированием после каждого изменения

Заключение и рекомендации

Ошибка 502 Bad Gateway в Nginx свидетельствует о нарушении коммуникации между веб-сервером и вышестоящими службами. Систематический подход к диагностике и устранению этой ошибки основан на проверке пяти ключевых направлений:

Основные причины и приоритетность проверки

  1. Сбой серверных служб — наиболее вероятная причина
    • Проверить статус PHP-FPM, Apache, серверов БД и кэширования
    • Выполнить перезапуск зависших служб
    • Проанализировать логи на предмет аварийных завершений
  2. Чрезмерная нагрузка на ресурсы — вторая по распространённости причина
    • Определить узкое место (CPU, память, I/O, сеть)
    • Выявить процессы с аномальным потреблением ресурсов
    • Проанализировать трафик на признаки DDoS или вредоносной активности
  3. Ошибки конфигурации — требуют детального анализа настроек
    • Проверить корректность всех конфигурационных файлов
    • Убедиться в совместимости версий ПО
    • Верифицировать параметры подключения к зависимым службам
  4. Блокировка брандмауэром — часто возникает после обновлений или миграций
    • Проверить доступность портов вышестоящих служб
    • Аудитировать правила брандмауэра
    • Убедиться в отсутствии конфликтов между сетевыми политиками
  5. Проблемы прикладного кода — наименее вероятная, но возможная причина
    • Проверить совместимость версий приложения и серверного ПО
    • Проанализировать логи на предмет сегментации памяти
    • Тестировать с отключёнными оптимизирующими модулями

Алгоритм быстрой диагностики

Для оперативного восстановления работы рекомендуется следующая последовательность действий:

  1. Проверка доступности служб:

    systemctl status nginx php-fpm mysql   # или соответствующие службы
  2. Анализ журналов ошибок:

    tail -50 /var/log/nginx/error.log
    tail -50 /var/log/php-fpm/error.log # если применимо
  3. Мониторинг ресурсов:

    top -bn1 | head -20                   # нагрузка CPU и памяти
    netstat -tulpn | grep -v LISTEN # сетевые соединения
  4. Проверка конфигурации:

    nginx -t                              # проверка синтаксиса конфигурации Nginx

Профилактические меры

Для предотвращения повторного возникновения ошибки 502 рекомендуется:

Дополнительные материалы

Для углублённого изучения смежных тем рекомендуем:

Комментарии


Дополнительные материалы

Предыдущая Статья

Что такое CSS маски и зачем они нужны

Следующая Статья

Архитектурная концепция Laravel: Сервис Провайдеры