我有一个在两个不同的 AWS 实例上运行的应用程序,我想启用基于 IP 的“粘性”或“持久”会话,以便我可以以特定方式利用 Web 套接字技术。
我有两种不同的设置,都涉及使用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 的“粘性”会话?
答案1
我的服务器位于 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;
}
}
答案2
根据 Nginx 文档,只有昂贵的 Plus 版本才支持粘性会话。我一直在研究替代方案,而我最接近的就是这个与 Nginx 1.5+ 不兼容的旧版本https://github.com/lusis/nginx-sticky-module
我也尝试构建一个 LUA 模块,但是没有用于对等选择的 API 挂钩,仅用于枚举和阻止。
更新
我发现了另一个很棒的模块,请参阅https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src