HAProxy 使用 balance source 实现基于客户端IP的会话保持,通过哈希确保同一IP始终调度至同一后端;支持 hash-type consistent 或 map-based,需配合 option forwardfor 和 http-request set-src 处理代理真实IP,且默认忽略权重。

HAProxy 根据来源 IP 进行流量调度,核心是使用 balance source 算法,它会对客户端 IP 做哈希计算,确保同一 IP 的请求始终落到同一台后端服务器上——这属于会话保持(session persistence)的典型实现,不依赖 cookie 或其他应用层标识。
关键点在于:IP 哈希结果固定 → 分发目标固定 → 无需额外配置 ACL 或 backend 切换逻辑
如何启用源 IP 调度
在 backend 段中指定 balance source 即可:
backend web_servers
mode http
balance source
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check- 默认使用客户端原始 IP(即
X-Forwarded-For不参与哈希,除非显式配置) - 若 HAProxy 前有 CDN 或代理,真实 IP 可能被覆盖,需配合
option forwardfor和http-request set-src提取可信 IP
控制哈希行为的细节
源 IP 调度支持两种哈希模式,通过 hash-type 控制:
-
hash-type consistent:一致性哈希,增删后端节点时尽量减少重映射(适合弹性扩缩容) -
hash-type map-based(默认):取模哈希,简单高效,但节点数变化会导致大量连接重分配
示例(启用一致性哈希):
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
backend web_servers
balance source
hash-type consistent
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check处理代理环境下的真实 IP
当请求经过 Nginx、CDN 或云负载均衡时,原始 IP 存在 X-Forwarded-For 头中。需做两件事:
- 启用
option forwardfor自动注入/传递该头 - 使用
http-request set-src显式提取并设为源地址(避免哈希错位)
frontend http_front
bind :80
option forwardfor
http-request set-src hdr(x-forwarded-for) if { hdr(x-forwarded-for) -m found }
default_backend web_servers⚠️ 注意:仅对可信上游代理启用此逻辑,否则易被伪造攻击。
权重与源 IP 调度的关系
balance source 默认忽略权重(weight),所有节点等概率参与哈希分片。如需加权影响分布,可:
- 使用
balance source weight(HAProxy 2.0+ 支持) - 或改用
balance uri+hdr(host)等组合策略间接实现分流控制
旧版本(如 1.5/1.8)中权重对 source 无效,这点务必确认版本再设计。
不复杂但容易忽略

















