温馨提示×

如何在centos实现tomcat集群

小樊
37
2025-12-19 12:53:56
栏目: 智能运维

在 CentOS 上搭建 Tomcat 集群的实用步骤

一、架构与准备

  • 架构建议:使用 Nginx 作为四层/七层反向代理与负载均衡,后端部署 2–N 个 Tomcat 实例;如需进一步提升整体可用性,可在 Nginx 前再加一层 Keepalived VIP 实现负载均衡器的高可用。会话保持可通过 Tomcat 内置集群的会话复制实现,也可采用外置 Memcached/Redis 方案。
  • 环境与版本建议:CentOS 7/8/Stream,安装 Java 8/11/17(与所用 Tomcat 版本匹配),Tomcat 9/10 均可。
  • 网络与防火墙:开放 80/443(Nginx)、各 Tomcat 的 8080(或自定义 HTTP 端口)、集群通信端口(见下文)、以及必要管理端口;云环境需同步配置安全组规则。
  • 目录规划:建议将 Tomcat 统一放置在 /opt/tomcat/,并为每个实例使用独立目录(如 /opt/tomcat/node1/opt/tomcat/node2)。

二、安装与基础配置

  • 安装 Java(示例为 OpenJDK 8):
    • 命令:sudo yum install -y java-1.8.0-openjdk-devel
    • 验证:java -versionjavac -version
  • 安装 Tomcat(示例为 Tomcat 9):
    • 下载与解压:wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.tar.gz && tar xvf apache-tomcat-9.0.56.tar.gz
    • 部署:sudo mv apache-tomcat-9.0.56 /opt/tomcat/node1
    • 如需多实例,复制目录为 node2,并分别修改各实例的 server.xml 中的 Server port(默认 8005)Connector port(默认 8080),避免端口冲突。
  • 启动与验证:
    • 启动:/opt/tomcat/node1/bin/startup.sh
    • 验证:访问 http://<节点IP>:8080 出现 Tomcat 欢迎页。

三、配置 Tomcat 集群与会话复制

  • 启用内置集群(最小配置):在每个实例的 $CATALINA_HOME/conf/server.xml 内加入:
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    
    如需更可控的复制参数,可使用如下较完整示例(按需调整):
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
      <Manager className="org.apache.catalina.ha.session.DeltaManager"
               expireSessionsOnShutdown="false"
               notifyListenersOnReplication="true"/>
      <Channel className="org.apache.catalina.tribes.group.GroupChannel">
        <Membership className="org.apache.catalina.tribes.membership.McastService"
                    address="228.0.0.4"
                    port="45564"
                    frequency="500"
                    dropTime="3000"/>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="auto"
                  port="4000"
                  autoBind="100"
                  selectorTimeout="5000"
                  maxThreads="6"/>
        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
          <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
        </Sender>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
      </Channel>
      <Valve className="org.apache.cala.catalina.ha.tcp.ReplicationValve" filter=""/>
      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>
    
    关键要点:
    • 各实例的 Receiver port(如 4000) 必须唯一;同一主机多实例需显式设置不同端口。
    • 组播地址 228.0.0.4:45564 需网络可达;云上或受限网络可改用 静态成员(StaticMembershipInterceptor) 或切换为外置会话共享方案。
  • 应用开启分布式会话:在应用的 WEB-INF/web.xml 根节点加入:
    <distributable/>
    
  • 可选优化:为各实例设置 jvmRoute(在 上)以便粘滞会话与故障排查,例如:jvmRoute="tomcat1"jvmRoute="tomcat2"

四、配置 Nginx 负载均衡

  • 安装 Nginx:
    • 命令:sudo yum install -y nginx
  • 配置 upstream 与反向代理(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/tomcat.conf):
    http {
      upstream tomcat_cluster {
        server 192.168.1.11:8080;
        server 192.168.1.12:8080;
        # 可按需增加权重、健康检查等
      }
    
      server {
        listen 80;
        server_name yourdomain.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 systemctl start nginx && sudo systemctl enable nginx
    • 验证:访问 http://<Nginx_IP>/ 能正常打开应用,并在多节点间轮询。

五、验证、扩展与常见问题

  • 验证集群与会话复制:
    • 部署一个能打印 JSESSIONID 的测试页,连续刷新观察是否出现 JVMRoute 后缀变化且会话不丢失(登录态/购物车等不中断)。
    • 查看各节点 catalina.out 是否有集群成员加入、复制消息与异常堆栈。
  • 扩展为高可用:
    • 两台 Nginx 前部署 Keepalived,通过 VRRP 提供 VIP,实现负载均衡器故障自动切换,进一步提升整体可用性。
  • 常见问题与处理:
    • 端口冲突:确保各实例的 Server port、Connector port、Receiver port 唯一且防火墙放行。
    • 组播不通:云环境常禁用或限制 IGMP/多播,可改用 静态成员 或采用 Memcached/Redis 会话共享方案(如 memcached-session-manager)。
    • 应用未启用分布式会话:确认 web.xml 包含

0