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

Базовый 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.