У меня есть приложение, работающее на двух разных экземплярах AWS, и я хотел бы включить «липкие» или «постоянные» сеансы на основе IP, чтобы я мог использовать преимущества технологий веб-сокетов определенным образом.
У меня есть две разные настройки, в каждой из которых используется ip_hash
чтобы включить эти липкие сеансы.
При первой настройке процессы приложения выполняются в том же экземпляре, что и конфигурация Nginx. Это работает, сеансы постоянны, как и ожидалось.
upstream my_app {
ip_hash;
# local servers
server 127.0.0.1:3001 weight=100 max_fails=5 fail_timeout=300;
server 127.0.0.1:3002 weight=100 max_fails=5 fail_timeout=300;
keepalive 8;
}
Во второй настройке я указываю на внешние экземпляры и пытаюсь добиться того же эффекта. Эта установка не работает. Другими словами, сеансы по-прежнему балансируются по нагрузке.
upstream my_app {
ip_hash;
# external servers
server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
keepalive 8;
}
Я использую ip_hash
правильно? Как я могу включить "липкие" IP-сессии для внешних серверов?
Согласно документации Nginx, поддержка Sticky-сессий доступна только для их дорогой версии Plus. Я исследовал альтернативы, и чем ближе я был, тем больше оказался этот старый форк, несовместимый с Nginx 1.5+. https://github.com/lusis/nginx-sticky-module
Я также попытался создать модуль LUA, но для выбора однорангового узла нет API-хуков, только для перечисления и блокировки.
Балансировка нагрузки Nginx Plus
Обновить
Я нашел еще один отличный модуль, см. https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src
Мой сервер находился за балансировкой нагрузки AWS, поэтому мне нужно было передать правильные заголовки в восходящий поток, чтобы он всегда отражал IP-адрес клиента. Следующая конфигурация устранила мою проблему (см. Строку с комментариями):
upstream my_app {
ip_hash;
server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
keepalive 8;
}
server {
server_name my-app.com;
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
# This is necessary to pass the correct IP to be hashed
real_ip_header X-Real-IP;
proxy_pass http://my_app/;
proxy_redirect off;
}
}