Apache 做七层反向代理负载均衡,核心模块:mod_proxy、mod_proxy_balancer、mod_proxy_http,再加调度算法模块。
原理:Apache 作为入口,接收客户端请求,按策略转发给后端多台 Web / 应用服务器;后端节点故障自动剔除,恢复后自动加回。
一、开启所需模块(Linux)
Debian/Ubuntu
a2enmod proxy
a2enmod proxy_balancer
a2enmod proxy_http
# 调度算法,选其一
a2enmod lbmethod_byrequests # 默认:按请求数加权轮询
#a2enmod lbmethod_bytraffic # 按流量字节数
#a2enmod lbmethod_bybusyness # 按当前活跃请求数(推荐,最小连接)
systemctl reload apache2
CentOS/RHEL(httpd)
不用 a2enmod,直接在httpd.conf取消注释加载模块:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
四种调度算法
表格
二、完整配置示例(虚拟主机 httpd.conf/vhost.conf)
# 关闭正向代理,只做反向代理
ProxyRequests Off
ProxyPreserveHost On
ProxyTimeout 30
# 定义负载均衡集群,集群名称 mycluster
<Proxy balancer://mycluster>
# 后端节点 loadfactor=权重,默认1;route用于会话保持
BalancerMember http://192.168.1.10:8080 loadfactor=1 route=node1
BalancerMember http://192.168.1.11:8080 loadfactor=1 route=node2
# 备用节点,只有其他全部故障才启用 status=+H
# BalancerMember http://192.168.1.12:8080 status=+H
# 选择调度算法
ProxySet lbmethod=bybusyness
# 会话保持:stickysession,基于cookie实现session粘滞
ProxySet stickysession=ROUTEID
</Proxy>
# 转发全部请求到集群
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
# 负载均衡管理页面(web监控面板,强烈建议限制访问IP)
<Location "/balancer-manager">
SetHandler balancer-manager
# 只允许本机和内网访问
Require ip 127.0.0.1 192.168.1.0/24
</Location>
会话保持 stickysession 说明
上面配置stickysession=ROUTEID,需要添加 Header 指令,让 Apache 下发 cookie 绑定用户到固定后端节点:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
注意:会话保持会破坏均衡,后端扩容、故障切换时用户 session 会丢失;能无状态化应用尽量不要开粘滞。
三、BalancerMember 常用参数
BalancerMember http://ip:port loadfactor=2 timeout=5 retry=30 status=+H
loadfactor:权重,数字越大分到请求越多timeout:代理超时retry:节点故障后,多久(秒)重试探测该节点status=+H:Hot Standby 热备节点,平时不接收流量
四、配置检查与验证
语法校验
# Ubuntu
apache2ctl -t
# CentOS
httpd -t
重载服务
systemctl reload apache2
访问管理面板:
http://你的域名/balancer-manager可以在线看每个节点状态、请求计数、启用 / 禁用后端节点,无需重启 Apache。
五、HTTPS 场景
Apache 统一做 SSL 卸载:证书配置在 Apache 虚拟主机,后端走 http;
如果后端是 https,需要启用
mod_proxy_ssl,BalancerMember 写https://。
六、高可用补充(Apache 本身是单点)
Apache 负载均衡只是七层分发,Apache 本身是单点故障。 如需入口高可用:
Keepalived + 多台 Apache 做 VIP 故障转移;
或者上层再套 LVS / 硬件负载均衡。
七、缺点对比
Apache 负载均衡适合中小规模,性能弱于 Nginx/HAProxy,高并发场景一般优先 HAProxy。
八、常见坑
ProxyPreserveHost On不加,后端拿到 host 是本机 host,容易 302 跳转异常;忘记开启
mod_proxy_http,代理转发直接报错;balancer-manager 不做 IP 限制,公网暴露会有安全风险;
会话粘滞开启后,故障切换用户 session 失效。