You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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(包含所有连接)。

验证与调整

  1. 检查配置合法性:执行 haproxy -c -f /etc/haproxy/haproxy.cfg
  2. 重启HAProxy使配置生效
  3. 通过HAStats页面(需额外配置stats enable等参数)查看自定义计数器的连接数,确认SignalR请求未被计入负载统计

内容的提问来源于stack exchange,提问作者Pavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:35:21