apache负载均衡中基于ip的会话保持本质是将同一客户端ip的请求固定转发至同一后端服务器,需确保透传真实ip(如通过requestheader set x-forwarded-for "%{remote_addr}e")并配合后端解析,否则因代理ip覆盖而失效;原生不支持ip_hash,可借助mod_proxy_balancer_iphash、rewrite哈希路由或共享session等方案实现。

Apache 负载均衡中基于 IP 的会话保持,本质是让同一个客户端 IP 地址的请求始终被转发到同一台后端服务器。它实现简单、无需应用层配合,但要注意真实 IP 获取是否准确——这是配置生效的前提。
确保后端能拿到真实客户端 IP
Apache 作为反向代理时,默认后端看到的是 Apache 自己的 IP(如 127.0.0.1 或内网地址)。必须主动透传真实 IP,否则“基于 IP”就变成了“基于 Apache 的 IP”,完全失效。
- 在
<virtualhost></virtualhost>或全局配置中添加:RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" - 如果前端还有 CDN 或其他代理,需检查
X-Forwarded-For是否已存在,并用expr取最左非私有 IP(避免伪造) - 后端应用(如 Tomcat、Spring Boot)需配置解析
X-Forwarded-For头,否则日志和会话逻辑仍用代理 IP
启用 mod_proxy_balancer 并配置 IP 哈希调度
Apache 本身不直接提供 “ip_hash” 指令(那是 Nginx 的写法),但可通过 lbmethod=bytraffic + ProxySet stickysession 组合间接实现,更推荐使用官方支持的 源地址哈希(source IP hash) 方式:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 加载必要模块:
mod_proxy、mod_proxy_http、mod_proxy_balancer、mod_lbmethod_byrequests(或bytraffic),以及mod_slotmem_shm - 在
<proxy></proxy>块中设置:ProxySet lbmethod=byrequests(轮询)本身不保证 IP 粘性;
真正起作用的是:ProxySet stickysession=ROUTEID|JSESSIONID配合 route 标识 —— 但若只想要纯 IP 映射,应改用 第三方模块mod_proxy_balancer_iphash(需自行编译),或退而求其次:用ProxySet lbmethod=byrequests+ProxySet timeout=300+ 后端 session 存储共享(如 Redis),规避对单节点强依赖
替代方案:用 rewrite + env 实现简易 IP 路由
若无法引入额外模块,可借助 Apache 的 mod_rewrite 和环境变量做轻量级路由:
- 提取客户端 IP 的哈希值(如取最后一位数字):
RewriteCond %{REMOTE_ADDR} ^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$RewriteRule ^(.*)$ $1 [E=IPHASH:%4] - 根据哈希值分发到不同 backend:
ProxyPass / balancer://cluster1/ env=IPHASH=1ProxyPass / balancer://cluster2/ env=IPHASH=2(需配合多个 balancer 定义) - 该方式适合固定后端数量、且 IP 分布较均匀的场景,运维成本略高,但完全原生、无依赖
注意事项与常见陷阱
基于 IP 的会话保持在实际生产中容易出问题,务必提前评估:
- 局域网出口 NAT:几十甚至几百用户共用一个公网 IP,全部落到同一台后端,造成严重倾斜
- 移动网络切换:4G/5G/WiFi 切换时 IP 变更,会话中断
- CDN 或云 WAF:真实 IP 被隐藏,
REMOTE_ADDR是 CDN 节点 IP,必须依赖X-Forwarded-For并严格校验 - IPv6 地址长度变化大,哈希分布可能不均,建议统一转为 IPv4 兼容格式或改用 session ID 方式









