Apache mod_proxy与mod_proxy_balancer可构建轻量反向代理负载均衡系统,支持会话保持、健康检查及安全加固,适用于中小规模集群并与Apache功能深度集成。

Apache 的 mod_proxy 模块配合 mod_proxy_balancer,可构建轻量、稳定且易于管理的反向代理型负载均衡系统。它不依赖外部组件,适合中小规模服务集群,尤其在需要与 Apache 原有功能(如 .htaccess 控制、SSL 终止、URL 重写)深度集成时优势明显。
基础配置:启用模块并定义后端节点
确保以下模块已启用:
- mod_proxy
- mod_proxy_http(或 mod_proxy_ajp 等协议模块)
- mod_proxy_balancer
- mod_slotmem_shm(用于共享内存存储会话状态,推荐启用)
在虚拟主机或主配置中添加均衡器定义:
<Proxy "balancer://mycluster">
BalancerMember http://192.168.1.10:8080 route=server1 loadfactor=3
BalancerMember http://192.168.1.11:8080 route=server2 loadfactor=2
BalancerMember http://192.168.1.12:8080 status=+H # 热备节点
ProxySet lbmethod=byrequests
</Proxy>
<p>ProxyPass "/app" "balancer://mycluster/app"
ProxyPassReverse "/app" "balancer://mycluster/app"说明:route 参数用于粘性会话;status=+H 表示该节点为热备;lbmethod 可选 byrequests(轮询)、bytraffic(按流量)、bybusyness(按当前请求数)。
会话保持(Sticky Session)配置
当后端应用自身无共享 session 机制时,需由 Apache 保证同一用户请求落到同一节点:
- 后端应用需在响应中设置含 JSESSIONID 或自定义 cookie(如 ROUTEID)的会话标识
- 在 BalancerMember 中声明 route,并启用 stickysession:
<Proxy "balancer://mycluster">
BalancerMember http://192.168.1.10:8080 route=server1
BalancerMember http://192.168.1.11:8080 route=server2
ProxySet stickysession=ROUTEID|JSESSIONID
</Proxy>Apache 会自动解析 cookie 中的 route 值并匹配对应后端。若 cookie 不含 route,或 route 无效,则按 lbmethod 转发。
健康检查与故障转移优化
默认情况下,mod_proxy_balancer 不主动探测后端健康状态。可通过以下方式增强可靠性:
- 启用 mod_proxy_hcheck(Apache 2.4.43+)实现主动健康检查:
BalancerMember http://192.168.1.10:8080 \
hcmethod=GET \
hcinterval=10 \
hcuri="/health" \
hcexpr="%{REQUEST_STATUS} == 200"- 未启用 hcheck 时,可依赖被动检测:连续失败 failonstatus 或超时后自动标记为 down,并在 retry 秒后尝试恢复
- 建议为每个 BalancerMember 显式设置:timeout=5 retry=60,避免长连接阻塞和过早剔除节点
性能与安全加固建议
生产环境应关注以下关键点:
- 连接复用:启用 mod_proxy_http 后,默认开启 HTTP/1.1 keepalive。建议后端也启用长连接,并设置 ProxySet max=50 min=5 smax=20 控制连接池大小
- 超时控制:在 ProxyPass 后添加 timeout=30 keepalive=On,防止慢后端拖垮代理
- Header 过滤:使用 RequestHeader unset 和 Header unset 清理敏感头(如 Server、X-Powered-By),避免泄露后端信息
- 访问控制:限制 /balancer-manager 路径仅内网可访问,并启用认证:
<Location "/balancer-manager">
Require ip 192.168.1.0/24
AuthType Basic
AuthName "Balancer Manager"
AuthUserFile /etc/httpd/.balancer-htpasswd
Require valid-user
</Location>










