温馨提示×

如何在centos上实现tomcat集群配置

小樊
45
2026-01-10 06:54:10
栏目: 智能运维

在 CentOS 上搭建 Tomcat 集群的实操指南

一 架构与准备

  • 架构建议:前端使用 Nginx/HAProxy/Apache+mod_jk 做负载均衡,后端部署 2 个及以上 Tomcat 实例;会话保持可用 sticky session会话复制
  • 节点规划示例:
    • 负载均衡器:IP 192.168.1.10
    • Tomcat A:IP 192.168.1.11,HTTP 8080,AJP 8009,Server 8005
    • Tomcat B:IP 192.168.1.12,HTTP 8081,AJP 8010,Server 8105
  • 基础环境:安装 Java 8/11(保持一致版本),关闭 SELinux 或放行相关端口,防火墙开放 80/8080/8081/8009/8010

二 安装与端口规划

  • 安装 Java(示例为 OpenJDK 8):
    • 命令:sudo yum install -y java-1.8.0-openjdk-devel
  • 安装 Tomcat(两台一致版本,示例 9.0.x):
    • 下载与解压: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
  • 端口规划与修改(示例)
    • Tomcat A(保持默认或按需调整):
      • Server port:8005
      • Connector HTTP:8080
      • AJP:8009
    • Tomcat B(避免冲突):
      • Server port:8105
      • Connector HTTP:8081
      • AJP:8010
    • 提示:若同机多实例,还需修改 shutdown.sh 使用的端口、JVM 调试端口等,避免端口占用。

三 配置 Tomcat 集群与会话复制

  • 为引擎设置唯一 jvmRoute(用于粘性会话与路由标识):
    • Tomcat A:Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA"
    • Tomcat B:Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB"
  • 启用内置集群(DeltaManager + Tribes 组播)。在 server.xml 的 Engine 内加入(或取消注释并完善)如下片段:
    <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.catalina.ha.tcp.ReplicationValve" filter=""/>
      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/"
                watchDir="/tmp/war-listen/" watchEnabled="false"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>
    
  • 应用会话复制要求:将应用的 WEB-INF/web.xml 加入 <distributable/>,否则会话不会参与复制。
  • 可选外置会话存储:跨机房或不便组播时,可用 Redis/Memcached 集中会话(如 memcached-session-manager),适合与 Nginx/HAProxy 组合使用。

四 配置负载均衡

  • 方案 A:Nginx(HTTP 反向代理,简单通用)
    • 安装:sudo yum install -y nginx
    • 配置示例(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/lb.conf):
      upstream tomcat_cluster {
          server 192.168.1.11:8080;
          server 192.168.1.12:8081;
          # 需要会话粘滞时启用:
          # ip_hash;
      }
      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 systemctl enable --now nginx
  • 方案 B:Apache HTTP Server + mod_jk(AJP,适合与 Tomcat 紧耦合)
    • 安装与模块:sudo yum install -y httpd mod_jk
    • 配置 workers.properties(/etc/httpd/conf/workers.properties):
      worker.list=loadbalancer,status
      worker.tomcatA.type=ajp13
      worker.tomcatA.host=192.168.1.11
      worker.tomcatA.port=8009
      worker.tomcatA.lbfactor=1
      
      worker.tomcatB.type=ajp13
      worker.tomcatB.host=192.168.1.12
      worker.tomcatB.port=8010
      worker.tomcatB.lbfactor=1
      
      worker.loadbalancer.type=lb
      worker.loadbalancer.balance_workers=tomcatA,tomcatB
      worker.loadbalancer.sticky_session=1
      worker.status.type=status
      
    • 配置 httpd.conf(或 00-base.conf 等包含文件):
      LoadModule jk_module modules/mod_jk.so
      JkWorkersFile /etc/httpd/conf/workers.properties
      JkLogFile /var/log/httpd/mod_jk.log
      JkLogLevel info
      
      JkMount /* loadbalancer
      JkMount /jk-status status
      
    • 启动:sudo systemctl enable --now httpd
  • 提示:若启用 sticky_session=1,需保证 Tomcat 的 jvmRoute 与负载均衡器路由一致,避免会话漂移。

五 启动与验证

  • 启动顺序:先启动所有 Tomcat,再启动 Nginx/Apache
  • 健康检查与日志:
    • Tomcat:tail -f /opt/tomcat/logs/catalina.out
    • Nginx:tail -f /var/log/nginx/error.log
    • Apache:tail -f /var/log/httpd/error_logmod_jk.log
  • 验证要点:
    • 访问 http://负载均衡器IP/,刷新多次,观察是否分发到不同后端(可在页面打印 server IP/端口 或查看 access 日志)。
    • 会话粘滞测试:登录后反复刷新,确认登录状态不丢失(开启 sticky 时)。
    • 会话复制测试:关闭当前承载会话的 Tomcat,确认会话仍可用(无感切换,验证 DeltaManager 复制)。
    • 防火墙/安全组:确保 80/8080/8081/8009/8010 已放行;云环境需配置安全组规则。
    • 生产建议:开启 Tomcat access log、Nginx/Apache 访问与错误日志轮转;必要时引入 监控与告警(如 Prometheus + Grafana)。

0