上一篇
httpdtomcat负载均衡
- 行业动态
- 2025-05-01
- 4673
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实例配置不同port
和shutdown
端口:
<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_expires 和mod_headers 优化缓存策略 |
相关问题与解答
Q1:如何验证负载均衡是否生效?
A:
- 在Tomcat的
server.xml
中为每个节点添加唯一标识(如<Context>
中添加distributable="true"
) - 连续刷新测试页面,观察访问日志中的
ROUTE
字段变化 - 使用
ab
压力测试工具验证请求分发情况:ab -n 1000 -c 10 http://yourdomain/test
Q2:如何实现Tomcat集群的高可用性?
A:
- 主从备份:部署Keepalived管理虚拟IP,实现Apache自动切换
- 数据持久化:
- 使用MySQL/Redis存储Session
- 配置Tomcat的
<Manager>
元素指向共享存储
- 心跳检测:通过
mod_proxy_balancer
的route=NODE
+maxattempts
参数自动剔除故障节点 - 日志聚合:使用ELK(Elasticsearch/Logstash/