Настройка балансировки нагрузки со Sticky Sessions в Nginx (Session Persistence)
- Пользователи внезапно разлогиниваются или теряют корзину при переходе между страницами из-за переключения ноды балансировки.
- Сессии PHP/Java не реплицируются между бэкенд-серверами.
- Неравномерное распределение трафика при использовании классического
ip_hashза общими корпоративными NAT-шлюзами.
1. Способ 1: Использование алгоритма ip_hash
Привязка запросов на основе клиентского IP-адреса:
upstream backend_cluster {
ip_hash;
server 192.168.1.10:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 down; # Маркировка временно выведенной ноды
}2. Способ 2: Консистентное хеширование по Cookie (Sticky Session в Open Source)
Привязка запроса к значению Cookie сессии (например, PHPSESSID или JSESSIONID):
upstream backend_cluster {
# Хеширование по значению cookie сессии с консистентным распределением
hash $cookie_PHPSESSID consistent;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}3. Конфигурация проксирования в server блоке
server {
listen 443 ssl http2;
server_name app.itstm.ru;
location / {
proxy_pass http://backend_cluster;
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 http_502 http_503;
}
}4. Применение настроек
nginx -t && systemctl reload nginx Частые вопросы (FAQ)
В чем недостаток ip_hash перед cookie hashing?
Если тысячи пользователей заходят из одной корпоративной сети или мобильного оператора через один внешний NAT IP, ip_hash направит их всех на один бэкенд-сервер, перегрузив его.
Что делает параметр 'consistent' в директиве hash?
Он использует алгоритм Ketama Consistent Hashing. При падении или добавлении нового сервера перераспределяется лишь минимальная часть ключей сессий, а не весь пул.