HAProxy基于客户端IP的会话保持核心是balance source算法,对源IP哈希后固定分发至同一后端;需配置mode http或tcp,可选hash-type consistent提升稳定性,并注意NAT、IP变动及前端代理导致的真实IP获取问题。

HAProxy 实现基于客户端 IP 的会话保持,核心是使用 balance source 调度算法,它对客户端源 IP 地址做哈希运算,将相同 IP 的请求始终分发到同一台后端服务器。
配置方式很简单
在 backend 或 listen 段中启用即可:
- 必须指定
mode http或mode tcp(balance source同时支持四层和七层) - 写入
balance source—— 注意不是source balance或其他变体 - 可选添加
hash-type consistent提升节点增减时的稳定性(尤其后端数量常变动时)
实际配置示例
以下是一个典型的 HTTP 后端配置:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
backend app_servers
mode http
balance source
hash-type consistent
server app1 192.168.1.10:80 check
server app2 192.168.1.20:80 check
请求进来后,HAProxy 会提取 TCP 层的源 IP(如未经过 NAT 或代理),计算哈希值,再对后端数量取模,决定转发目标。
要注意的几个关键点
- 如果客户端在 NAT 网关后(比如企业内网、运营商级 NAT),多个用户共享一个出口 IP,会导致所有请求被分到同一台后端,造成负载倾斜
- 移动网络或 DHCP 场景下,客户端 IP 可能频繁变化,会话容易中断
- 后端服务器宕机时,该 IP 对应的会话会直接丢失,HAProxy 不会自动迁移已有连接(除非配合
option redispatch和健康检查) - 若前端有 CDN、反向代理或 WAF,真实客户端 IP 可能被覆盖,需确保通过
X-Forwarded-For或 PROXY 协议传递,并在 HAProxy 中用option forwardfor或send-proxy正确提取
替代方案:stick-table 更灵活
如果需要更精细控制(比如限制单 IP 并发数、设置超时时间、结合其他字段),可用 stick-table:
backend app_servers
stick-table type ip size 1m expire 30m
stick on src
server app1 192.168.1.10:80 check
server app2 192.168.1.20:80 check
这种方式支持自定义过期时间、表大小,并可扩展为 stick on src,dst_port 等组合键,适合复杂策略场景。

















