当前位置:首页 > 行业动态 > 正文

httpdtomcat负载均衡

Apache httpd通过mod_proxy_balancer模块配置反向代理,将请求分发至多节点

前置准备

环境需求

组件 版本要求 作用
Apache HTTPD 4+ 反向代理与负载均衡
Tomcat 0+/8.5+/9.0+ 应用服务器集群
JDK 与Tomcat版本匹配 Tomcat运行依赖
共享存储 可选(如Redis/Memcached) Session共享(非必需但推荐)

核心组件说明

  • mod_jk:Apache专用Tomcat连接器(需手动配置workers.properties
  • mod_proxy_balancer:基于URL哈希/轮询的通用负载均衡模块
  • mod_proxy_ajp:通过AJP协议连接Tomcat(需开启Tomcat AJP连接器)
  • mod_ssl:HTTPS支持(需提前配置证书)

配置步骤(以mod_proxy_balancer为例)

启用必要模块

# 加载负载均衡相关模块
a2enmod proxy_balancer proxy_http proxy_ajp ssl

配置后端Tomcat节点

编辑server.xml,为每个Tomcat实例配置不同portshutdown端口:

httpdtomcat负载均衡  第1张

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Apache虚拟主机配置

<VirtualHost :80>
    # 启用SSL时取消注释以下行
    # SSLEngine on
    # SSLCertificateFile /path/to/cert.pem
    # SSLCertificateKeyFile /path/to/key.pem
    # 负载均衡配置
    ProxySet lbmethod=byrequests      # 轮询算法(可选bytraffic/bybusyness)
    ProxyPreserveHost On
    # 定义后端节点
    <Proxy balancer://mycluster>
        BalancerMember "http://192.168.1.101:8080" route=node1
        BalancerMember "http://192.168.1.102:8080" route=node2
        # 可添加更多节点
    </Proxy>
    # 代理规则
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/
    # 静态资源优化(可选)
    Alias /static/ "/var/www/html/static/"
    <Location /static>
        SetHandler none
        Order allow,deny
        Allow from all
    </Location>
</VirtualHost>

高级功能配置

健康检查

<Proxy balancer://mycluster>
    # 启用健康检查(需mod_proxy_balancer 2.3.4+)
    BalancerMember "http://192.168.1.101:8080" route=node1 maxattempts=3
    BalancerMember "http://192.168.1.102:8080" route=node2 maxattempts=3
</Proxy>

会话粘性(Sticky Session)

# 基于Cookie的会话保持(需Tomcat配置COOKIE)
Header add Set-Cookie "ROUTEID=%{BALANCER_WORKER_ROUTE}e; Path=/" env=BALANCER_ROUTE_CHANGED

权重调整(Weighted Round Robin)

<Proxy balancer://mycluster>
    BalancerMember "http://192.168.1.101:8080" route=node1 weight=3
    BalancerMember "http://192.168.1.102:8080" route=node2 weight=1
</Proxy>

常见问题与优化

问题 解决方案
雪崩效应 启用健康检查,结合maxattempts参数避免请求发送到故障节点
Session不一致 启用会话粘性或部署集中式Session存储(如Redis)
SSL证书部署 在Apache层配置SSL终止,后端Tomcat使用HTTP通信
静态资源缓存 将静态资源托管到Apache,配置mod_expiresmod_headers优化缓存策略

相关问题与解答

Q1:如何验证负载均衡是否生效?

A

  1. 在Tomcat的server.xml中为每个节点添加唯一标识(如<Context>中添加distributable="true"
  2. 连续刷新测试页面,观察访问日志中的ROUTE字段变化
  3. 使用ab压力测试工具验证请求分发情况:
    ab -n 1000 -c 10 http://yourdomain/test

Q2:如何实现Tomcat集群的高可用性?

A

  1. 主从备份:部署Keepalived管理虚拟IP,实现Apache自动切换
  2. 数据持久化
    • 使用MySQL/Redis存储Session
    • 配置Tomcat的<Manager>元素指向共享存储
  3. 心跳检测:通过mod_proxy_balancerroute=NODE+maxattempts参数自动剔除故障节点
  4. 日志聚合:使用ELK(Elasticsearch/Logstash/
0