Обратный прокси всплесками выдаёт 502/503/504 — диагностируйте и почините
Обратный прокси перед пулом бэкендов начинает всплесками возвращать ошибки шлюза. Вы гоняете health-пробу в цикле и читаете лог прокси. Объясните, что здесь значит каждый из 502, 503 и 504 — какой указывает на мёртвый апстрим, какой на таймаут, а какой на отсутствие здоровых бэкендов — и дайте фикс для каждого.
$ for i in $(seq 5); do curl -so /dev/null -w '%{http_code}\n' https://api.internal/; done
502
504
503
502
504
# nginx error.log
[error] connect() failed (111: Connection refused) while connecting to upstream, upstream: "http://10.0.0.7:8080"
[error] upstream timed out (110: timed out) while reading response header from upstream
[error] no live upstreams while connecting to upstream, host: "api.internal"
Определите каждый код и дайте фикс.
Каждый код — своя причина сбоя. 502 Bad Gateway — апстрим ответил некорректно или отказал в соединении (упал или не тот порт). 504 Gateway Timeout — апстрим принял, но не ответил в таймаут прокси (медленный/перегружен). 503 — здоровых бэкендов нет. Чините причину: бэкенд, таймаут или health-check.
- ✗Путать 502 (плохой ответ) и 504 (таймаут апстрима)
- ✗Перезапускать прокси, когда сбой в апстриме
- ✗Считать 503 клиентской ошибкой, а не отсутствием здоровых бэкендов
- →Какая настройка прокси чаще всего вызывает 504 под нагрузкой?
- →Как неверный health-check даёт 503 при живых pod-ах?
Решение
1. Читаем коды как разные причины
Все три — ответы шлюза (прокси/LB) о состоянии апстрима, а не самого прокси:
502 Bad Gateway → апстрим ответил некорректно ИЛИ отказал (Connection refused)
504 Gateway Timeout → апстрим принял, но не ответил в срок (upstream timed out)
503 Service Unavailable → в пуле нет живых апстримов (no live upstreams)
В логе прямо видно соответствие: connect() failed (111: Connection refused) → 502; upstream timed out (110) → 504; no live upstreams → 503.
2. Диагноз по каждому
- 502 — бэкенд
10.0.0.7:8080упал или слушает не тот порт: соединение отклонено. - 504 — бэкенд жив, но медленный/перегружен: не уложился в
proxy_read_timeout. - 503 — health-check выкинул все бэкенды из пула (или они правда все мертвы).
3. Фикс
502 → поднять/починить бэкенд, проверить порт и что процесс слушает
504 → ускорить апстрим ИЛИ поднять proxy_read_timeout; проверить нагрузку
503 → починить health-check (порог/путь/интервал), вернуть живые инстансы в пул
Не перезапускайте прокси вслепую — он лишь честно сообщает о состоянии апстрима.