Как исправить ошибку 502 Bad Gateway: Гайд для админов

Пошаговая инструкция по диагностике и устранению сбоя соединения между Nginx и бэкендом. Верните сервис в онлайн за 5 минут.

Что такое 502 Bad Gateway и почему это опасно?

Ошибка 502 возникает, когда веб-сервер (обычно Nginx или Apache), выступающий в роли шлюза, получает недействительный ответ от вышестоящего сервера (бэкенда).

В контексте стека LEMP (Linux, Nginx, MySQL, PHP) это чаще всего означает, что Nginx не смог связаться с процессом PHP-FPM. Для бизнеса это критический сценарий: пользователи видят белую страницу с кодом ошибки, корзина в интернет-магазине очищается, а заявки не доходят.

Согласно отчету PulseKit за 2023 год, 40% инцидентов с недоступностью сервисов в РФ связаны именно с переполнением очереди процессов PHP-FPM или исчерпанием оперативной памяти.

Топ-3 причины ошибки 502 в продакшене

1. Переполнение очереди PHP-FPM

Если параметр pm.max_children в конфигурации PHP-FPM установлен слишком низко, при всплеске нагрузки все воркеры оказываются заняты. Новые запросы попадают в очередь, а Nginx, не дождавшись ответа за время fastcgi_read_timeout, возвращает 502.

2. Нехватка оперативной памяти (OOM Killer)

Когда серверу не хватает RAM для запуска нового процесса PHP, системный демон OOM Killer принудительно убивает самый "жирный" процесс, часто ломая связь между Nginx и бэкендом. Проверьте логи через dmesg | grep -i "out of memory".

3. Сетевые таймауты и буферы

Если бэкенд отвечает медленно (например, из-за тяжелых SQL-запросов), ответ может не поместиться в буфер Nginx (proxy_buffer_size). В результате соединение разрывается до передачи заголовков клиенту.

Как исправить: конкретные шаги

Не гадайте — действуйте по алгоритму. Вот проверенные решения для стандартных конфигураций.

Решение А: Увеличение лимитов PHP-FPM

Откройте конфиг пула (обычно /etc/php/8.2/fpm/pool.d/www.conf). Измените директивы:

  • Установите pm = dynamic
  • Увеличьте pm.max_children (расчет: (RAM - 1ГБ) / средний размер процесса PHP).
  • Перезапустите сервис: sudo systemctl restart php8.2-fpm.

Решение Б: Расширение таймаутов Nginx

Если скрипт выполняется дольше 60 секунд, Nginx сбрасывает соединение. Добавьте в блок server или location:

fastcgi_read_timeout 120s;
fastcgi_send_timeout 120s;
proxy_read_timeout 120s;

После правки выполните проверку конфигурации и graceful-перезагрузку: nginx -t && systemctl reload nginx.

Предотвратите повторение с PulseKit

Ждать, пока клиенты сообщат о проблеме — дорого. PulseKit позволяет обнаружить задержки и ошибки 502 за секунды до того, как они повлияют на конверсию.

Мониторинг HTTP-кодов

Настройте проверку статуса (Status Code Check). PulseKit опрашивает ваш сайт каждые 30 секунд. Если сервер вернет 502, вы мгновенно получите уведомление в Telegram или по email, а дашборд отобразит время простоя.

Мониторинг времени отклика

Ошибка 502 часто предшествует резкому росту времени загрузки. PulseKit фиксирует TTFB (Time To First Byte). Если время ответа превысило 2 секунды, система поднимет тревогу, давая вам время перезапустить сервисы до полного падения.

Гео-распределенные узлы

Проверьте доступность вашего сервиса из Москвы, Санкт-Петербурга и Новосибирска. Локальные проблемы маршрутизации часто маскируются под ошибки 502 на стороне сервера.

Попробовать PulseKit бесплатно