NGINX_UPSTREAM_FAIL
Linux / DevOps
Отказоустойчивый Upstream в Nginx: round-robin, least_conn, ip_hash
- Неравномерное распределение нагрузки между серверами приложений.
- Пользовательские сессии сбрасываются при балансировке между несколькими нодами.
- Nginx продолжает отправлять трафик на упавший сервер апстрима, вызывая ошибки 502/504 у клиентов.
1. Настройка блока Upstream с проверкой здоровья нод
Отредактируйте конфигурационный файл виртуального хоста Nginx:
upstream backend_cluster {
# Алгоритм распределения по наименьшему числу активных соединений
least_conn;
# Основные серверы с параметрами обнаружения сбоев
server 10.0.0.11:8080 weight=3 max_fails=3 fail_timeout=10s;
server 10.0.0.12:8080 weight=2 max_fails=3 fail_timeout=10s;
# Резервный сервер (активируется только при падении всех основных)
server 10.0.0.13:8080 backup;
# Пул постоянных keepalive соединений к апстримам
keepalive 64;
}2. Использование Upstream в блоке server
server {
listen 80;
server_name api.itstm.ru;
location / {
proxy_pass http://backend_cluster;
# Использование HTTP/1.1 и сброс заголовка для работы upstream keepalive
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Переключение на следующий сервер при сбое текущего
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 5s;
}
}3. Балансировка с фиксацией сессий (Session Sticky)
Для привязки клиента к конкретному серверу по IP используйте ip_hash; либо хэширование по Cookie/JWT: hash $cookie_session_id consistent;.
Практический опыт инженера:
Для критичных API обязательно настраивайте директиву proxy_next_upstream_timeout, чтобы клиент не ждал суммарный таймаут от всех серверов в пуле при глобальной недоступности кластера.
Частые вопросы (FAQ)
Зачем нужна директива keepalive в блоке upstream?
Она кэширует открытые TCP-соединения между Nginx и бэкендами, устраняя накладные расходы на постоянный three-way handshake и TLS negotiation при каждом запросе.
Что произойдет при срабатывании max_fails=3 и fail_timeout=10s?
Если сервер ответит ошибкой 3 раза подряд, Nginx исключит его из пула балансировки на 10 секунд, после чего отправит один пробный запрос для проверки восстановления.