使用哈希方法使用nginx进行负载均衡

时间:2015-04-28 05:10:17

标签: node.js nginx load-balancing

我想在几个node.js应用程序节点前面使用nginx作为负载均衡器。

round-robinip_hash方法难以置信地易于实现,但在我的用例中,它们并不是最合适的。

我需要nginx为客户端提供后端节点的会话ID,这些会话ID由第一个到达节点提供。

在我的谷歌搜索过程中,我提出了"哈希方法,但我找不到太多的资源。

以下是我的尝试:

my_site.conf:

http {

    upstream my_servers {
        hash $remote_addr$http_session_id consistent;
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
    }

    server {
        listen 1234;
        server_name example.com;

        location / {
            proxy_pass http://my_servers;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_redirect off;
            proxy_buffering off;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

在应用程序中,我使用会话ID返回Session-ID标题。

res.setHeader('Session-ID', req.sessionID);

我错过了什么,但是什么?

2 个答案:

答案 0 :(得分:2)

$http_session_id是指客户端(浏览器)发送的标头,而不是您的应用程序响应。你需要的是http://nginx.org/r/sticky,但它只是商业订阅。

third-party模块与商用模块相同,但你必须重新编译nginx。

答案 1 :(得分:0)

它没有开箱即用,因为nginx是一个(好的)网络服务器,但不是真正的负载均衡器。 更喜欢haproxy进行负载均衡。

此外,您需要的不是散列。您需要持久化session-id标头,并且您需要能够持久保存源IP,直到获得此标头。 HAProxy非常简单。 HAProxy还可用于检查会话ID是否已由服务器生成,或者是否已由客户端伪造。

后端myapp  #在内存中创建一个棒表  #(注意:使用peer来同步表的内容)  棒表类型字符串len 32到期1小时1米  #matget客户端http-session-id在表中做持久性  棒匹配hdr(http-session-id)  #如果找不到,则使用源IP地址  坚持src,降低#dirty trick将IP地址转换为字符串

#了解服务器生成的http-session-id  stick store-response hdr(http-session-id)

#如果http-session-id似乎是伪造的,则添加一个标头(在表中找不到)  #(注意:仅适用于1.6-dev)  找到acl has-session-id req.hdr(http-session-id)-m  acl unknown-session-id req.hdr(http-session-id),in_table(myapp)  http-request set-header X-warning unknown \ session-id if has-session-id unknown-session-id

然后你完全安全了:))

巴普蒂斯特