如何配置HAProxy在负载均衡时忽略SignalR连接计数?
HAProxy 忽略SignalR请求统计连接数并保留粘性会话的配置方案
核心思路
通过ACL标记SignalR请求,使用自定义连接计数器仅统计常规HTTP请求,基于该计数器进行负载均衡,同时保留粘性会话逻辑,避免轻量的SignalR长连接被误判为服务器负载过高。
完整配置示例
Frontend 配置
frontend http_front bind *:80 # 匹配SignalR请求(根据实际端点调整路径,比如/chatHub或/signalr) acl is_signalr path_beg /hub # 处理WebSocket升级(SignalR默认使用WebSocket传输) acl is_websocket hdr(Upgrade) -i WebSocket acl is_websocket hdr_beg(Connection) -i Upgrade http-request set-header Connection Upgrade if is_websocket # 粘性会话:基于ASP.NET会话Cookie(替换为你的实际会话Cookie名) stick store-response res.cookie(ASP.NET_SessionId) stick on req.cookie(ASP.NET_SessionId) # 仅将非SignalR请求计入自定义连接计数器sc0 http-request track-sc0 src if !is_signalr # 转发到后端服务器组 default_backend http_back
Backend 配置
backend http_back # 定义存储非SignalR连接数的stick-table stick-table type ip size 100k store conn_cur # 使用最少连接数算法,基于自定义计数器而非默认nbconn balance leastconn # 配置服务器:跟踪sc0计数器的连接数作为负载判断依据 server app1 192.168.1.10:80 check track-sc0 conn Cur(0) server app2 192.168.1.11:80 check track-sc0 conn Cur(0) # 调整WebSocket长连接超时(按需设置,单位为毫秒) timeout client 86400000 timeout server 86400000 timeout tunnel 86400000
关键配置说明
- SignalR请求标记:
acl is_signalr path_beg /hub匹配所有以/hub开头的请求,需根据你的SignalR实际端点路径修改。 - WebSocket支持:必须配置Upgrade头处理,否则SignalR的长连接会被HAProxy中断,影响正常通信。
- 粘性会话:通过
stick指令基于会话Cookie绑定用户到固定服务器,确保SignalR的长连接不会被路由到其他节点,避免会话中断。 - 自定义连接统计:
http-request track-sc0 src if !is_signalr仅让非SignalR请求计入sc0计数器,负载均衡时conn Cur(0)指定使用该计数器的连接数作为服务器负载判断标准,替代默认的nbconn(包含所有连接)。
验证与调整
- 检查配置合法性:执行
haproxy -c -f /etc/haproxy/haproxy.cfg - 重启HAProxy使配置生效
- 通过HAStats页面(需额外配置
stats enable等参数)查看自定义计数器的连接数,确认SignalR请求未被计入负载统计
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

