Nginx: proxy_next_upstream triggered (http_502 fallback) — Настройка
Клиентский запрос обрабатывается с заметной задержкой, после чего в журнале error.log Nginx фиксируется событие переключения между бэкенд-нодами: proxy_next_upstream triggered: http_502 fallback executed, client: ..., server: ..., upstream: "http://10.0.1.12:8080".
| Шаг выполнения | Событие | Состояние запроса |
|---|---|---|
| Попытка 1 | Upstream 1 вернул 502 Bad Gateway | Nginx перехватывает сбой и ищет резервную ноду |
| Попытка 2 | Upstream 2 успешно ответил 200 OK | Клиент получает успешный ответ с задержкой |
| Попытка 3 (Лимит исчерпан) | Все ноды ответили 502/Timeout | Клиент получает итоговый 502/504 статус |
- Успешные ответы отдаются клиентам с повышенным p99 latency (время суммируется из таймаутов всех опрошенных серверов).
- При падении одной из нод нагрузка мгновенно перераспределяется на оставшиеся серверы пула.
- Проверьте текущую конфигурацию директивы
proxy_next_upstreamв файлах виртуального хоста:location / { proxy_pass http://backend_pool; # Условия, при которых запрос перенаправляется следующему бэкенду: proxy_next_upstream error timeout invalid_header http_502 http_503 http_504; # Ограничение количества попыток (включая первую): proxy_next_upstream_tries 3; # Суммарный лимит времени на все попытки: proxy_next_upstream_timeout 10s; } - Уменьшите тайм-аут на установление первичного соединения, чтобы переключение происходило мгновенно:
proxy_connect_timeout 2s; - Изучите состояние упавшего upstream-сервера, зафиксированного в логах, и устраните первопричину сбоя на самом бэкенде.
- Если бэкенд обрабатывает мутирующие запросы (POST/PATCH/DELETE), убедитесь, что параметр
non_idempotentНЕ включен без необходимости, во избежание дублирования бизнес-операций. - Примените обновленные параметры:
sudo nginx -s reload.
proxy_next_upstream по умолчанию повторно отправляет ТОЛЬКО идемпотентные запросы (GET, HEAD, OPTIONS). Неидемпотентный POST-запрос НЕ будет передан следующему бэкенду при ошибке 502/504, если в конфиге явно не прописан флаг non_idempotent.Частые вопросы (FAQ)
Что делает флаг non_idempotent в proxy_next_upstream?
Он разрешает Nginx повторять запросы с методами POST, PUT, DELETE, PATCH на следующий сервер кластера, если предыдущий сервер вернул ошибку или оборвал связь.
Почему non_idempotent может быть опасен для интернет-магазинов?
Если бэкенд успел списать деньги с карты или создать заказ в БД, но упал до отправки заголовков HTTP-ответа в Nginx, Nginx повторит POST-запрос на другую ноду, что приведет к повторному списанию средств.
Какое значение proxy_next_upstream_tries используется по умолчанию?
По умолчанию значение равно 0, что означает отсутствие ограничений по числу попыток — Nginx попытается обойти последовательно абсолютно все серверы из блока upstream.
Как увидеть в access.log, сколько серверов было опрошено?
Добавьте в custom log_format переменные $upstream_addr, $upstream_status и $upstream_response_time.