我想在几个node.js应用程序节点前面使用nginx作为负载均衡器。
round-robin
和ip_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);
我错过了什么,但是什么?
答案 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
然后你完全安全了:))
巴普蒂斯特