Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
NGINX_UPSTREAM_FAIL Linux / DevOps

Отказоустойчивый Upstream в Nginx: round-robin, least_conn, ip_hash

Обновлено: 21.08.2026
  • Неравномерное распределение нагрузки между серверами приложений.
  • Пользовательские сессии сбрасываются при балансировке между несколькими нодами.
  • 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 секунд, после чего отправит один пробный запрос для проверки восстановления.