Nginx代理的粘性会话


10

我有一个在两个不同的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的“粘性”会话?


您的Nginx是否安装了“ ngx_http_upstream_module”?我不知道默认情况下是否包含它。“ nginx -V”通常输出其构建的模块。我的(从源头建造)没有提及它
蒂姆(Tim)

Answers:


7

我的服务器支持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;
    }
}

7

根据Nginx文档,粘性会话支持仅适用于其昂贵的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


您可以链接到此文档吗?
James Shewey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.