易君召
发布于 2026-09-21 / 作者:易君召 / 1 阅读
0

Apache(httpd 2.4)负载均衡实现

Apache 做七层反向代理负载均衡,核心模块:mod_proxymod_proxy_balancermod_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

四种调度算法

表格

lbmethod

说明

byrequests

加权请求轮询(默认),按请求次数分配

bytraffic

按传输字节数加权,适合文件下载场景

bybusyness

按当前活跃请求数,优先发给负载最低节点(业务推荐)

heartbeat

配合 mod_heartbeat,集群节点状态广播

二、完整配置示例(虚拟主机 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 热备节点,平时不接收流量

四、配置检查与验证

  1. 语法校验

# Ubuntu
apache2ctl -t
# CentOS
httpd -t
  1. 重载服务

systemctl reload apache2
  1. 访问管理面板: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。

八、常见坑

  1. ProxyPreserveHost On 不加,后端拿到 host 是本机 host,容易 302 跳转异常;

  2. 忘记开启mod_proxy_http,代理转发直接报错;

  3. balancer-manager 不做 IP 限制,公网暴露会有安全风险;

  4. 会话粘滞开启后,故障切换用户 session 失效。