CentOS 上实现 Tomcat 负载均衡
一、方案总览
- 常见做法是在前端部署Nginx或Apache HTTP Server做反向代理与负载均衡,后端运行多个 Tomcat 实例。为提升可用性,可启用会话保持或会话复制(如 Tomcat 内置集群或外置 Redis 集中会话)。Nginx 适合高并发 HTTP 场景,Apache 可通过 mod_jk 或 mod_proxy_ajp 与 Tomcat 的 AJP/1.3 协议对接。
二、方案一 Nginx 反向代理与负载均衡
- 安装与启动
- 安装:sudo yum install -y nginx
- 启动与开机自启:sudo systemctl start nginx && sudo systemctl enable nginx
- 配置 upstream 与反向代理(示例:/etc/nginx/conf.d/tomcat.conf)
- 防火墙放行
- 开放 80 与后端 8080:sudo firewall-cmd --add-port={80,8080}/tcp --permanent && sudo firewall-cmd --reload
- 验证
- 访问 http://<Nginx_IP>/,刷新观察请求在多个 Tomcat 间分发;查看 /var/log/nginx/access.log 与 Tomcat 日志确认分发与健康检查效果。
三、方案二 Apache HTTP Server + mod_jk 或 mod_proxy_ajp
- 安装与启用
- 安装:sudo yum install -y httpd
- 启动与开机自启:sudo systemctl start httpd && sudo systemctl enable httpd
- 方式 A:mod_jk(AJP)
- 编译安装 tomcat-connectors(生成 mod_jk.so),在 httpd.conf 中加载模块并配置 workers.properties 与虚拟主机 JkMount;为每个 Tomcat 配置不同的 AJP/1.3 端口(如 8009/8010),并在 Engine 上设置 jvmRoute。
- 方式 B:mod_proxy_ajp
- 在虚拟主机中使用 BalancerMember ajp://ip:8009 定义集群成员,实现 AJP 负载均衡与反向代理。
- 验证
- 访问 http://<Apache_IP>/,通过日志与 Tomcat 控制台确认 AJP 连接与会话分发正常。
四、会话保持与共享
- 会话粘滞(Nginx)
- 在 upstream 中使用 ip_hash; 让同一客户端固定到同一后端,适用于不改动应用的快速方案(注意跨网段/NAT 与容量倾斜问题)。
- Tomcat 内置集群会话复制
- 在 server.xml 的 Engine 上设置唯一 jvmRoute,并启用 ;在 context.xml 配置 DeltaManager 与 ClusterListener 以进行会话复制(适合同机房、节点稳定的场景)。
- 外置 Redis 集中会话
- 将 Jedis/Lettuce 等依赖及 Tomcat-Redis-Session-Manager 的 JAR 放入 $CATALINA_HOME/lib,在 context.xml 配置 (或相应实现),将 session 存储到 Redis,对横向扩容与跨机房更友好。
五、部署与验证清单
- 多实例端口规划
- 同机多实例需确保 Server port、HTTP 8080、AJP 8009、Shutdown 端口 等互不冲突;跨机部署时注意 防火墙/安全组 放行 80/8080/8009。
- 健康检查与摘除
- Nginx 使用 max_fails/fail_timeout 实现被动健康检查;生产可结合主动健康检查脚本或商用探针,确保异常节点及时摘除与恢复。
- 日志与观测
- 核查 /var/log/nginx/error.log、$CATALINA_HOME/logs/catalina.out 与 localhost_access_log,确认负载分发、会话粘滞或复制是否生效。
- 快速验证步骤
- 在 /webapps/ROOT/index.jsp 中加入实例标识(如 IP/端口),反复刷新页面观察分发;登录类应用验证会话是否保持或跨节点共享无误。