我有一个应用程序在两个不同的AWS实例上运行,我希望启用基于IP的“sticky”或“persistent”会话,这样我就可以以特定的方式利用web socket技术。
我有两个不同的设置,都涉及使用ip_hash启用这些粘滞的会话。
在第一个设置中,应用程序进程与Nginxconfiguration在同一个实例上运行。 这是行得通的 ,会议如期举行。
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
我也试图build立一个LUA模块,但是没有用于对等select的API钩子,只是为了枚举和阻塞。
Nginx Plus负载平衡
更新
我发现了另一个很棒的模块,请参阅https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src
我的服务器是在AWS负载平衡之后,所以我需要将正确的标题传递给上游,以便始终反映客户端IP。 以下configuration解决了我的问题(请参阅注释行):
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; } }