Debian中Tomcat集群搭建
小樊
39
2025-12-06 01:01:40
在 Debian 上搭建 Tomcat 集群
一 架构与准备
- 架构建议:前端使用 Nginx 做反向代理与负载均衡,后端部署 2 个及以上 Tomcat 实例;同一主机多实例需确保各实例端口不冲突,并为每个实例设置唯一 jvmRoute 以便会话粘滞与故障转移。会话保持可采用 Tomcat 内置的 DeltaManager 组播复制,或外置 Redis 集中会话存储。为提升可靠性,复制可配置为异步并开启确认机制。上述要点涵盖环境准备、实例端口规划、jvmRoute 与负载均衡选型、会话复制方式及性能参数取舍。
二 安装与多实例配置
- 安装 Java 与创建用户
- 安装 JDK:sudo apt update && sudo apt install openjdk-11-jdk
- 创建系统用户:sudo groupadd tomcats && sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
- 部署 Tomcat 多实例(示例为 /opt/tomcat1 与 /opt/tomcat2)
- 下载解压 Apache Tomcat 9 至 /opt/tomcat9,然后复制出实例目录:
- sudo cp -R /opt/tomcat9 /opt/tomcat1 && sudo cp -R /opt/tomcat9 /opt/tomcat2
- 修改各实例的 conf/server.xml
- 为 Engine 增加唯一 jvmRoute(如:tomcat1、tomcat2)
- 调整端口避免冲突(示例:Server 8005/8006,HTTP 8080/8081,AJP 8009/8010,Redirect 8443/8443)
- 创建 systemd 服务(示例:/etc/systemd/system/tomcat1.service)
- 关键项:Type=forking,User=tomcat,Group=tomcat,Environment 设置 JAVA_HOME、CATALINA_PID、CATALINA_HOME、CATALINA_BASE 与 CATALINA_OPTS(如:-Xms512M -Xmx1024M)
- 启动与开机自启:sudo systemctl daemon-reload && sudo systemctl start tomcat1 && sudo systemctl enable tomcat1(同法启动 tomcat2)
- 一键命令清单(可按需调整版本与路径)
- sudo apt update && sudo apt install -y openjdk-11-jdk
- sudo groupadd tomcats && sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
- sudo mkdir -p /opt/tomcat1 /opt/tomcat2
- wget -O /tmp/tomcat9.tgz https://downloads.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz
- sudo tar -zxvf /tmp/tomcat9.tgz -C /opt && sudo mv /opt/apache-tomcat-9.0.76 /opt/tomcat9
- sudo cp -R /opt/tomcat9 /opt/tomcat1 && sudo cp -R /opt/tomcat9 /opt/tomcat2
-
编辑 server.xml:设置 jvmRoute 与端口(略)
-
创建 tomcat1.service/tomcat2.service(略)
- sudo systemctl daemon-reload && sudo systemctl enable --now tomcat1 tomcat2
以上步骤覆盖安装 JDK、创建专用用户、复制实例目录、端口与 jvmRoute 规划及 systemd 托管,满足在单机上运行多实例的需求。
三 负载均衡配置 Nginx
- 安装与站点配置
- 安装:sudo apt install nginx
- 配置示例(/etc/nginx/sites-available/tomcat 或 /etc/nginx/nginx.conf 的 http 段内):
- upstream tomcat_cluster { server 192.168.1.11:8080; server 192.168.1.12:8080; }
- server { listen 80; 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 systemctl reload nginx
- 说明
- 多实例跨主机时,upstream 中使用各实例的 IP:8080;同机多实例使用不同 HTTP 端口(如 8080/8081)。如需会话粘滞,可在 Nginx 使用 ip_hash 或基于 Cookie 的 sticky(需第三方模块或商业版),Tomcat 端配合 jvmRoute 使用效果更佳。
四 会话复制与验证
- 内置集群会话复制(DeltaManager,组播)
- 在每个实例的 conf/server.xml 的 Engine 内加入(或取消注释)如下片段:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 同一主机多实例时,确保各实例 Receiver port(如 4000/4001)不同;跨主机保持 组播地址与端口一致。
- 在应用的 WEB-INF/web.xml 中加入:,使会话可复制。
- 外置 Redis 会话存储(可选,集中式)
- 安装 Redis:sudo apt install redis-server
- 在 conf/context.xml 的 Context 中加入(示例):
- 说明:Redis 方案便于跨语言与跨平台共享会话,并减少节点间网络复制压力。
- 验证步骤
- 访问 Nginx 入口(如 http://your-domain/),刷新与并发请求应被分发到不同 Tomcat;登录后查看 JSESSIONID(若使用 jvmRoute,后缀应随节点变化),停止某实例后业务仍可用;查看 catalina.out 与 localhost_access_log 确认复制与健康状态。
五 生产要点与排错
- 关键实践
- 所有实例 Tomcat 版本、应用版本与配置保持一致;应用需标记为 distributable。
- 防火墙放行:Tomcat 实例的 HTTP(8080/8081…)、AJP(8009/8010,若启用)、以及集群 组播 UDP 45564 与各实例 Receiver 端口(如 4000/4001)。
- 日志与告警:关注 catalina.out、localhost_access_log 与 nginx/error.log;为 Nginx 配置 健康检查与健康阈值,避免将请求转发至异常实例。
- JVM 与 GC:为生产设置合适的堆(如 -Xms/-Xmx)与 GC 策略;开启 JMX 或导出指标,结合 Prometheus/Grafana 监控线程、连接、GC 与复制延迟。
- 常见故障
- 端口冲突:同一主机多实例未调整 Server/Connector/AJP/Receiver 端口。
- 组播不通:云厂商或防火墙屏蔽 IGMP/组播,可改用 静态成员或外置会话存储(如 Redis)。
- 会话不复制:应用未加 ,或复制 Valve 未生效;检查 Cluster/Manager/Channel/Valve 配置是否完整且一致。