【发布时间】:2011-12-30 05:55:02
【问题描述】:
我有几个在 HAProxy 下运行身份验证的 socket.io 实例,我需要强制身份验证请求和套接字连接转到同一个实例。我已经基于this answer to a SO question 设置了 HAProxy,并进行了一些修改:
global
maxconn 4096 # Total Max Connections. This is dependent on ulimit
nbproc 2
defaults
mode http
frontend all 0.0.0.0:80
timeout client 86400000
default_backend www_backend
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
use_backend socket_backend if is_websocket
backend www_backend
balance url_param sessionId
option forwardfor # This sets X-Forwarded-For
timeout server 30000
timeout connect 4000
server server1 localhost:8081 weight 1 maxconn 1024 check
server server2 localhost:8082 weight 1 maxconn 1024 check
server server3 localhost:8083 weight 1 maxconn 1024 check
backend socket_backend
balance url_param sessionId
option forwardfor # This sets X-Forwarded-For
timeout queue 5000
timeout server 86400000
timeout connect 86400000
server server1 localhost:8081 weight 1 maxconn 1024 check
server server2 localhost:8082 weight 1 maxconn 1024 check
server server3 localhost:8083 weight 1 maxconn 1024 check
我尝试了 url_param(其中 sessionId 是在身份验证调用和 websocket 连接中传递的查询字符串参数)和 source 作为平衡选项,但似乎 HAProxy 只允许这些选项用于 HTTP 连接,因此忽略它们实际的 websocket 连接。结果是有时auth请求和socket连接会在不同的服务器上结束,这对我们的应用来说是不可接受的。
有什么方法可以实现这种期望的行为吗?
【问题讨论】:
-
您有没有想过最好的方法?我想做同样的事情。谢谢。
-
我最终使用了 IP 哈希平衡。来自同一个 IP 的所有请求都到同一个服务器
-
好的,但这是否意味着从服务器 A 上的用户广播的 websocket 不会到达服务器 B 上的任何用户?
-
您需要使用单独的数据库来存储会话。 Socket.io 支持 redis 数据库来存储跨节点的套接字会话信息,只需将不同的 socket.io 服务器指向同一个 redis db,它应该可以工作。
标签: node.js load-balancing socket.io haproxy