Linux

Nginx как балансировщик нагрузки: round robin, least_conn, веса и failover

Nginx умеет распределять HTTP-запросы между несколькими backend-серверами через блок upstream. По умолчанию используется round robin, а для неравномерных запросов часто полезен least_conn.

Схема балансировки нагрузки Nginx

Базовый upstream

upstream app_backend {
    server 10.0.10.11:8080;
    server 10.0.10.12:8080;
    server 10.0.10.13:8080;
}

server {
    listen 443 ssl;
    server_name app.example.com;

    location / {
        proxy_pass http://app_backend;
    }
}

least_conn для долгих запросов

upstream app_backend {
    least_conn;
    server 10.0.10.11:8080;
    server 10.0.10.12:8080;
}

Этот режим направляет новый запрос на backend с меньшим числом активных соединений. Он полезен, когда часть запросов обрабатывается заметно дольше остальных.

Веса серверов

upstream app_backend {
    server 10.0.10.11:8080 weight=3;
    server 10.0.10.12:8080;
}

Так более мощный сервер получает большую долю трафика.

Пассивный failover

upstream app_backend {
    server 10.0.10.11:8080 max_fails=3 fail_timeout=10s;
    server 10.0.10.12:8080 max_fails=3 fail_timeout=10s;
    server 10.0.10.13:8080 backup;
}

Open-source Nginx умеет пассивно исключать backend после неудачных попыток соединения. Полноценные активные health checks относятся к NGINX Plus.

Сессии пользователей

Round robin и least_conn не гарантируют попадание одного пользователя на один backend. Лучше хранить сессии во внешнем Redis/БД. Если приложение этого не умеет, можно использовать ip_hash, понимая его ограничения для NAT и прокси.

Передавайте корректные заголовки

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_set_header X-Forwarded-Proto $scheme;

Перед reload сначала выполняйте nginx -t.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *