Что означает HTTP статус-код 502 Bad Gateway?

Ответ

HTTP 502 Bad Gateway — код состояния, указывающий, что сервер, действуя как шлюз или прокси, получил недопустимый ответ от вышестоящего сервера.

Типичные причины:

  1. Бэкенд-сервер недоступен (упал, не запущен).
  2. Таймаут соединения с бэкендом.
  3. Некорректная конфигурация прокси/шлюза.
  4. Перегрузка бэкенд-сервера.

Архитектурный пример:

Клиент → [Прокси-сервер (Nginx)] → [Бэкенд-сервер (App)]
                    |                        |
               Возвращает 502           Не отвечает/отдаёт ошибку

Действия при диагностике:

  • Проверить статус бэкенд-сервиса: systemctl status my-backend-service
  • Изучить логи прокси-сервера (Nginx):
    tail -f /var/log/nginx/error.log
    # Типичная ошибка:
    # upstream timed out (110: Connection timed out) while connecting to upstream
  • Проверить доступность бэкенда вручную:
    curl -v http://backend-host:8080/health
  • Увеличить таймауты в конфиге Nginx (временное решение):
    location /api/ {
        proxy_pass http://backend;
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
    }

Ответ 18+ 🔞

Да ты посмотри на эту хуйню, HTTP 502 Bad Gateway! Это ж классика, ёпта! Представь себе картину: сидит наш прокси-сервер, типа Nginx, такой важный, как швейцар в дорогом отеле. А ты — клиент, подходишь и говоришь: «Мне к бэкенду, пожалуйста».

И тут наш швейцар-прокси идёт к двери, за которой должен сидеть бэкенд-сервер (этот, приложение там, API), стучит: «Тук-тук, мужик, там клиент пришёл!». А в ответ — тишина, блядь. Или там такое мычание непонятное, что и ответом-то назвать язык не поворачивается.

Вот прокси-сервер, весь такой в недоумении, разводит руками и возвращается к тебе: «Извините, сударь, а бэкенд-сервер, сука, нихуя не отвечает. Вот вам бумажка с кодом 502. Разбирайтесь с ним сами, я не мальчик на побегушках».

И откуда эта напасть, спрашивается, берётся? Да элементарно, Ваня!

  1. Бэкенд-сервер просто накрылся медным тазом. Упал, не запущен, его кто-то по пьяни kill -9 отправил. Самая частая причина, блядь.
  2. Таймаут соединения. Прокси стучится-стучится, а бэкенд такой тугодум, думает, думает... Прокси машет рукой: «Да похуй, не дождался» — и бац, 502 в ответ.
  3. Конфигурация кривая. В настройках прокси указан не тот адрес, не тот порт. Он стучится в соседнюю дверь, а там бабушка живёт, которая в программировании ни хуя не шарят.
  4. Бэкенд перегружен. Запросов овердохуища, он не справляется, зависает и снова нихуя не отвечает.

Вот смотри, как это архитектурно выглядит, чтоб ты понимал масштаб трагедии:

Ты (Клиент) → [Прокси-сервер (Nginx, наш "швейцар")] → [Бэкенд-сервер (Приложение)]
                    |                                                   |
               Возвращает тебе 502,                     Либо молчит как рыба,
               лицо кислое                             либо орёт что-то невнятное

Ну и что делать, если эта хрень случилась? Не паниковать, а лезть в логи, блядь!

  • Первым делом — ткнуть палкой в бэкенд. Жив ли вообще?

    systemctl status my-backend-service

    Если там inactive (dead) — всё, пиши пропало, причина найдена. Поднимай его, ебать его в сраку.

  • Потом — в логи прокси-сервака заглянуть. Там обычно всё написано, как на духу.

    tail -f /var/log/nginx/error.log

    Ищешь что-то вроде: connect() failed (111: Connection refused) while connecting to upstream — это когда бэкенд мёртв. Или upstream timed out (110: Connection timed out) — это когда он слишком долго тупил.

  • Проверить доступность вручную, с терминала. Подключись к серверу прокси и попробуй достучаться до бэкенда, как это делает Nginx.

    curl -v http://backend-host:8080/health

    Если Connection refused или таймаут — ну вот, пиздец, бэкенд действительно сдох или недоступен.

  • Если проблема в таймаутах (бэкенд просто медленный уёбок), можно в конфиге Nginx время ожидания увеличить. Но это костыль, а не решение! Решение — чинить бэкенд.

    location /api/ {
        proxy_pass http://backend;
        proxy_connect_timeout 60s;  # Даём минуту на установление связи
        proxy_read_timeout 60s;     # И минуту на то, чтобы ответ прислал
    }

Короче, 502 — это всегда история про то, что прокси не смог договориться с бэкендом. Ищи проблему на стороне бэкенда или в сети между ними. Удачи, там, не обосрись с дебагом!