apache中实现ip hash负载均衡需启用mod_proxy、mod_proxy_http、mod_proxy_balancer和mod_lbmethod_byrequests模块,在块内配置proxyset lbmethod=iphash,并配合mod_remoteip获取真实客户端ip,确保同一ip始终路由至同一后端服务器。

Apache 虚拟主机中配置基于哈希的负载均衡(常被称作“IP Hash”),实际是通过 mod_proxy_balancer 配合 mod_lbmethod_byrequests 模块启用 lbmethod=iphash 实现的——注意:Apache 没有原生 hash 或 ip_hash 指令,iphash 是 lbmethod_byrequests 模块提供的调度策略之一。
关键不是“加载 BalancerMember 模块”,而是正确组合模块、配置语法和真实客户端 IP 处理。
✅ 必须启用的模块
在主配置(如 httpd.conf 或 apache2.conf)中确保以下模块已加载:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule remoteip_module modules/mod_remoteip.so # 推荐,用于获取真实客户端 IP
⚠️ 缺少
lbmethod_byrequests_module,lbmethod=iphash会被忽略,Apache 启动时可能报错或静默回退为轮询(byrequests)。
验证方式:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
httpd -M | grep -E 'proxy|lbmethod|remoteip'
应看到全部四者状态为 shared。
✅ 在 <virtualhost></virtualhost> 内配置 IP Hash 集群
所有配置写在虚拟主机块内,避免全局污染。示例:
<virtualhost>
ServerName app.example.com
# 确保不开启正向代理
ProxyRequests Off
# 启用 RemoteIP 获取真实 IP(若前端有 Nginx/CDN)
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 192.168.1.0/24 # 根据实际代理网段调整
<proxy>
BalancerMember http://192.168.1.10:8080 route=node1
BalancerMember http://192.168.1.11:8080 route=node2
ProxySet lbmethod=iphash
</proxy>
ProxyPass / balancer://myapp/
ProxyPassReverse / balancer://myapp/
# 可选:开启管理界面(仅限内网)
<location>
SetHandler balancer-manager
Require ip 127.0.0.1 192.168.1.0/24
</location></virtualhost>
?
route=node1不是必须项,但强烈建议显式设置:
- 便于
balancer-manager页面识别节点;- 若后续配合
stickysession(如 Cookie 路由),需与后端 Session ID 的ROUTEID保持一致。
✅ 确保哈希依据的是真实客户端 IP
默认情况下,Apache 会用连接来源 IP(即上一级代理 IP)做哈希,导致所有请求都落到同一台后端。解决办法:
- 启用
mod_remoteip并配置RemoteIPHeader(如X-Forwarded-For); - 设置可信代理网段(
RemoteIPInternalProxy),否则该 Header 会被忽略; - 重启 Apache 后,
iphash就基于用户真实 IP 计算一致性哈希,同一 IP 始终命中同一route节点。
✅ 验证是否生效
- 访问
/balancer-manager,查看各节点的 Elected 列是否按客户端 IP 稳定增长(相同 IP 多次请求,只增一个节点的计数); - 用两台不同设备(或隐身窗口 + 不同公网 IP)访问服务,检查响应头或日志中
BALANCER_WORKER_ROUTE是否固定; - 开启代理日志确认路由分配:
LogFormat "%h %l %u %t \"%r\" %>s %b %{BALANCER_WORKER_ROUTE}e" hashlog CustomLog logs/iphash.log hashlog
不复杂但容易忽略细节。核心就三点:模块齐全、lbmethod=iphash 写在 <proxy></proxy> 块里、真实 IP 能被正确提取。









