温馨提示×

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_BASECATALINA_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.xmlEngine 内加入(或取消注释)如下片段:
      • - - - - - - - - - - - - -
    • 同一主机多实例时,确保各实例 Receiver port(如 4000/4001)不同;跨主机保持 组播地址与端口一致
    • 在应用的 WEB-INF/web.xml 中加入:,使会话可复制。
  • 外置 Redis 会话存储(可选,集中式)
    • 安装 Redis:sudo apt install redis-server
    • conf/context.xmlContext 中加入(示例):
    • 说明:Redis 方案便于跨语言与跨平台共享会话,并减少节点间网络复制压力。
  • 验证步骤
    • 访问 Nginx 入口(如 http://your-domain/),刷新与并发请求应被分发到不同 Tomcat;登录后查看 JSESSIONID(若使用 jvmRoute,后缀应随节点变化),停止某实例后业务仍可用;查看 catalina.outlocalhost_access_log 确认复制与健康状态。

五 生产要点与排错

  • 关键实践
    • 所有实例 Tomcat 版本、应用版本与配置保持一致;应用需标记为 distributable
    • 防火墙放行:Tomcat 实例的 HTTP(8080/8081…)AJP(8009/8010,若启用)、以及集群 组播 UDP 45564 与各实例 Receiver 端口(如 4000/4001)
    • 日志与告警:关注 catalina.out、localhost_access_lognginx/error.log;为 Nginx 配置 健康检查与健康阈值,避免将请求转发至异常实例。
    • JVM 与 GC:为生产设置合适的堆(如 -Xms/-Xmx)与 GC 策略;开启 JMX 或导出指标,结合 Prometheus/Grafana 监控线程、连接、GC 与复制延迟。
  • 常见故障
    • 端口冲突:同一主机多实例未调整 Server/Connector/AJP/Receiver 端口。
    • 组播不通:云厂商或防火墙屏蔽 IGMP/组播,可改用 静态成员或外置会话存储(如 Redis)。
    • 会话不复制:应用未加 ,或复制 Valve 未生效;检查 Cluster/Manager/Channel/Valve 配置是否完整且一致。

0