在 Debian 上部署 Tomcat 集群的标准做法
一 架构与准备
- 架构建议:前端使用 Nginx/HAProxy 做负载均衡,后端 2–N 台 Tomcat 组成集群,通过内置的 SimpleTcpCluster 进行会话复制,实现高可用与横向扩展。
- 基础环境:
- 安装 OpenJDK(所有节点版本保持一致):sudo apt update && sudo apt install -y default-jdk
- 安装 Tomcat 9(两种常见方式):
- 方式A:下载解压官方二进制包到 /opt/tomcat;
- 方式B:使用系统包管理器安装 tomcat9(便于使用 systemd)。
- 创建专用系统用户:sudo groupadd tomcat && sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
- 目录与权限:将 Tomcat 目录属主设为 tomcat:tomcat,保证最小权限运行。
二 多实例与端口规划
- 同一台主机运行多个实例时,需确保以下端口不冲突:
- Server 关闭端口(默认为 8005)
- HTTP 连接器端口(默认为 8080)
- AJP 端口(默认为 8009,如使用 AJP)
- 集群 Receiver 端口(tribes 接收器,默认示例为 4000,同一主机需不同)
- 示例(同一主机两实例):
- 实例A:8005、8081、8009、4000
- 实例B:8006、8082、8010、4001
- 如跨主机部署,仅需保证各实例的 Receiver 端口与 HTTP 端口可达即可。
三 Tomcat 集群配置
- 为各实例的 Engine 设置唯一 jvmRoute(用于负载均衡的会话粘滞与路由):
- 在 Engine 内启用 SimpleTcpCluster(示例为常见可用配置):
- 使用 DeltaManager 进行会话复制(适合各节点应用一致的场景);
- Membership 使用组播发现节点(示例:228.0.0.4:45564,frequency=500ms,dropTime=3000ms);
- Receiver 使用 NIO(示例端口 4000/4001,同一主机需不同);
- 添加 TcpFailureDetector、TcpPingInterceptor、MessageDispatch15Interceptor 提升可靠性与吞吐;
- 在 Host 内添加 ReplicationValve,确保请求结束前复制会话变更;
- 可选:启用 FarmWarDeployer 做集群内 WAR 分发(生产建议禁用,改为 CI/CD 统一发布)。
- 示例片段(放到 Engine 内):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 应用需支持集群:在应用的 WEB-INF/web.xml 中加入 。
四 负载均衡配置
- 使用 Nginx 作为前端负载均衡(示例):
- 安装:sudo apt install -y nginx
- 配置 /etc/nginx/sites-available/tomcat:
- upstream tomcat_cluster {
- server 192.168.1.101:8081;
- server 192.168.1.102:8082;
- }
- server {
- listen 80;
- server_name your_domain.com;
- location / {
- proxy_pass http://tomcat_cluster;
- 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;
- }
- }
- 启用与生效:sudo ln -s /etc/nginx/sites-available/tomcat /etc/nginx/sites-enabled/ && sudo nginx -t && sudo systemctl reload nginx
- 会话粘滞:若使用 jvmRoute,可在 upstream 中使用 ip_hash 或在应用端使用 JSESSIONID 的路由后缀配合 JvmRouteBinderValve 实现更稳定的会话保持。
五 启动与验证
- 启动服务:
- 方式A(二进制包):/opt/tomcat/bin/startup.sh(建议使用 systemd 托管);
- 方式B(系统包):sudo systemctl start tomcat9。
- 验证要点:
- 访问前端域名/IP,确认请求在多个 Tomcat 实例间分发(查看各实例日志或返回自定义实例标识);
- 登录应用后,执行会话保持测试(不登录时新建会话并刷新),验证会话在节点间复制;
- 停止某一实例,确认业务不中断、会话仍可用(取决于复制与负载均衡策略);
- 生产建议接入 监控与告警(如 Prometheus + Grafana 采集 Tomcat 指标)。
六 常见问题与优化
- 组播限制:部分云厂商或网络环境禁用/限制 IGMP 组播,会导致节点发现失败。可改用 静态成员(StaticMembershipInterceptor) 或改用外置会话存储(如 Redis)实现会话共享。
- 复制可靠性:在 Channel 上设置合适的 channelSendOptions(如异步 + ACK:值为 10),在吞吐与可靠性间取得平衡。
- 同一主机多实例:务必确保 Server、HTTP、AJP、Receiver 端口均不冲突,并正确设置 address=“auto” 或本机 IP。
- 应用一致性:DeltaManager 要求各节点应用版本与部署内容一致;如节点应用差异较大,可考虑 BackupManager 或外置会话存储方案。
- 会话粘滞与路由:启用 JvmRouteBinderValve 处理 failover 后的 JSESSIONID 重写,避免会话丢失。