Nginx: upstream server is temporarily blacklisted — Балансировка
Nginx перестает отправлять запросы на один или несколько серверов из балансировочного пула, возвращая клиентам ошибки 502 Bad Gateway или 504 Gateway Timeout. В журнале фиксируется исключение ноды: upstream server <IP:port> is temporarily blacklisted due to fail_timeout или no live upstreams while connecting to upstream.
| Параметр Upstream | Значение по умолчанию | Следствие для кластера |
|---|---|---|
max_fails=1 | 1 неудачная попытка | Нода выбивается из балансировки при единичной сетевой флуктуации |
fail_timeout=10s | 10 секунд | Сервер полностью изолируется от клиентского трафика на данный интервал |
proxy_next_upstream | error timeout | Определяет, какие именно статусы считаются поводом для блэклиста |
- Полноценно работающий бэкенд перестает получать запросы из-за разового долгого SQL-запроса или всплеска latency.
- При высокой нагрузке серверы поочередно выпадают в блэклист («эффект домино»), полностью парализуя сервис.
- Откройте конфигурацию балансировочного пула в
nginx.conf. - Увеличьте порог допустимых ошибок
max_failsи скорректируйте окно тайм-аутаfail_timeout:upstream backend_cluster { # Разрешаем до 5 сбоев в течение 30 секунд перед временным отключением ноды на 15 секунд: server 10.0.1.10:8080 max_fails=5 fail_timeout=30s; server 10.0.1.11:8080 max_fails=5 fail_timeout=30s; server 10.0.1.12:8080 backup; } - Если вы хотите полностью отключить механизм исключения серверов (чтобы Nginx всегда пытался отправить запрос):
upstream backend_cluster { server 10.0.1.10:8080 max_fails=0; server 10.0.1.11:8080 max_fails=0; } - Точно настройте условия, при которых ошибка считается сбоем ноды (исключив клиентские ошибки 4xx и некритичные статусы):
location / { proxy_pass http://backend_cluster; # Переключаться на следующий бэкенд только при явных фатальных ошибках: proxy_next_upstream error timeout invalid_header http_502 http_503; proxy_next_upstream_tries 3; proxy_next_upstream_timeout 10s; } - Проверьте синтаксис и примените конфигурацию:
sudo nginx -t && sudo systemctl reload nginx.
non_idempotent в proxy_next_upstream, иначе при таймауте запрос может повторно выполниться на другой ноде, вызвав дублирование транзакции!Частые вопросы (FAQ)
Как Nginx возвращает сервер обратно в строй после fail_timeout?
После истечения интервала fail_timeout Nginx аккуратно пропускает ровно один клиентский запрос на проблемный сервер. Если он отрабатывает успешно, сервер снова считается живым.
Что означает директива server ... backup?
Сервер с флагом backup никогда не получает трафик в штатном режиме. Он активируется Nginx только в том случае, если все основные серверы пула вышли из строя.
Считаются ли ответы HTTP 500 сбоем для max_fails?
По умолчанию нет. Сбоями считаются только сетевые ошибки TCP, таймауты соединения и некорректные заголовки, если иное не задано в proxy_next_upstream.
Что произойдет, если все ноды пула превысят max_fails?
Nginx сбросит все таймеры блокировки и моментально вернет ошибку '502 Bad Gateway: no live upstreams'.