怎样在Linux上实现Tomcat负载均衡
导读:在 Linux 上实现 Tomcat 负载均衡 一、方案总览与选型 常见做法是在前端部署Nginx / Apache HTTP Server / HAProxy做反向代理与负载均衡,后端运行多个 Tomcat 实例。Nginx 配置简洁、...
在 Linux 上实现 Tomcat 负载均衡
一、方案总览与选型
- 常见做法是在前端部署Nginx / Apache HTTP Server / HAProxy做反向代理与负载均衡,后端运行多个 Tomcat 实例。Nginx 配置简洁、性能出色;Apache 既可用 mod_proxy 也可用 mod_jk 与 Tomcat 通信;HAProxy 在高并发和四层/七层调度上表现稳定。若需要会话保持,可结合 Tomcat 的集群会话复制或使用 Redis/Memcached 做分布式会话共享。
二、方案一 Nginx 反向代理与负载均衡(推荐)
- 安装
- Ubuntu/Debian:sudo apt update & & sudo apt install nginx tomcat9
- CentOS/RHEL:sudo yum install epel-release & & sudo yum install nginx
- 配置 upstream 与反向代理
- 编辑 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf,示例:
http { upstream tomcat_servers { server 192.168.1.101:8080 weight=1 max_fails=3 fail_timeout=30s; server 192.168.1.102:8080 weight=1 max_fails=3 fail_timeout=30s; # 可选:ip_hash; 实现会话粘滞 } server { listen 80; server_name your_domain_or_ip; location / { proxy_pass http://tomcat_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
- 编辑 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf,示例:
- 启动与验证
- 检查语法:sudo nginx -t
- 重启:sudo systemctl restart nginx
- 访问前端地址,确认请求被分发到不同 Tomcat(可在应用页打印 JVM Route 或服务器 IP 进行验证)。
三、方案二 Apache HTTP Server 负载均衡(mod_proxy 与 mod_jk)
- 使用 mod_proxy(HTTP 代理,配置直观)
- 启用模块:sudo a2enmod proxy proxy_http
- 配置虚拟主机(/etc/apache2/sites-available/your-site.conf):
< VirtualHost *:80> ServerName your_domain_or_ip ProxyPreserveHost On ProxyPass / balancer://tomcatcluster/ ProxyPassReverse / balancer://tomcatcluster/ < Proxy balancer://tomcatcluster> BalancerMember http://192.168.1.101:8080 BalancerMember http://192.168.1.102:8080 < /Proxy> < /VirtualHost> - 启用站点并重启:sudo a2ensite your-site.conf & & sudo systemctl restart apache2
- 使用 mod_jk(AJP,长连接、成熟稳定)
- 安装模块:sudo apt install libapache2-mod-jk
- 配置 workers.properties(/etc/apache2/workers.properties):
worker.list=lbcontroller worker.tomcat1.type=ajp13 worker.tomcat1.host=192.168.1.101 worker.tomcat1.port=8009 worker.tomcat2.type=ajp13 worker.tomcat2.host=192.168.1.102 worker.tomcat2.port=8009 worker.lbcontroller.type=lb worker.lbcontroller.balance_workers=tomcat1,tomcat2 worker.lbcontroller.sticky_session=1 - 在 Apache 配置中加载并挂载:
JkWorkersFile /etc/apache2/workers.properties JkMount /* lbcontroller - 重启 Apache:sudo systemctl restart apache2。
四、会话保持与集群
- 会话粘滞(Sticky Session)
- Nginx:在 upstream 中使用 ip_hash; 实现基于客户端 IP 的会话粘滞。
- Apache mod_jk:设置 worker.lbcontroller.sticky_session=1 启用粘滞会话。
- Tomcat 集群会话复制(无共享存储前提)
- 在 server.xml 的 Engine 或 Host 内加入:
< Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> - 在应用的 META-INF/context.xml 或 conf/context.xml 中启用集群管理器(示例为 DeltaManager):
< Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> < ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> - 注意:集群复制会增加网络与 CPU 开销,跨机房慎用;建议为集群节点配置一致的 jvmRoute(在 Engine 上)以便日志追踪与粘滞配合。
- 在 server.xml 的 Engine 或 Host 内加入:
- 分布式会话共享(推荐用于弹性扩缩与多活)
- 将会话存入 Redis/Memcached(通过 Spring Session 或 Tomcat 的第三方 Valve/Filter 集成),可显著降低集群耦合、提升故障切换与水平扩展能力。
五、健康检查、验证与运维要点
- 健康检查与故障隔离
- Nginx:在 upstream 成员上配置 max_fails=3 fail_timeout=30s,自动摘除异常节点;结合主动健康检查(商业版或第三方模块)效果更佳。
- Apache/HAProxy:均可配置 HTTP/HTTPS/TCP 健康检查,确保仅将流量转发至健康实例。
- 快速验证
- 多次请求前端地址,观察是否按权重分发;在响应中打印 session ID 与 JVM Route 或服务器标识,确认会话粘滞或复制是否生效。
- 使用 curl -I 或浏览器开发者工具查看响应头与后端节点;查看 access.log/error.log 与 catalina.out 排查异常。
- 安全与优化
- 仅暴露 80/443 给前端负载均衡器,Tomcat 置于内网;启用 TLS/HTTPS;为静态资源设置缓存与压缩;合理设置 worker_processes/worker_connections(Nginx)与 KeepAlive(Tomcat/AJP)。
- 建议接入监控告警(如 Prometheus + Grafana),对 5xx 错误率、响应时延、后端健康状态 进行可视化与阈值告警。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 怎样在Linux上实现Tomcat负载均衡
本文地址: https://pptw.com/jishu/755392.html
