温馨提示×

Tomcat在Linux中的集群配置

小樊
39
2025-12-22 18:39:46
栏目: 智能运维

Linux下搭建 Tomcat 集群的标准做法


一 架构与准备

  • 架构选型
    • 前端使用Nginx/HAProxy/Apache+mod_jk做负载均衡与故障转移。
    • 后端多个Tomcat 实例组成集群,通过内置的DeltaManager会话复制保持会话一致(适合中小规模)。
  • 环境与版本
    • 操作系统:CentOS 7/8、Ubuntu 20.04/22.04 等均可。
    • Java:JDK 1.8(或更高,保持各节点一致)。
    • Tomcat:8.5/9.x 同版本(建议完全一致,避免序列化兼容问题)。
  • 基础要求
    • 各节点时间同步(如 NTP)。
    • 防火墙/安全组开放必要端口(实例 HTTP/8080、集群通信端口、负载均衡监听端口等)。
    • 应用需支持分布式会话(可序列化、无本地文件/缓存依赖)。

二 多实例部署与端口规划

  • 单实例安装
    • 下载解压 Tomcat 至如 /opt/tomcat;配置环境变量(示例):
      • CATALINA_HOME=/opt/tomcat
      • JAVA_HOME=/opt/jdk/jdk1.8.0_401
  • 复制多实例
    • /opt 下创建多个目录(如 tomcat01、tomcat02、tomcat03),将解压目录完整拷贝到各实例目录。
  • 端口避免冲突(server.xml)
    • 修改各实例的 Server port(如 8005/8006/8007)、Connector port(如 8080/8081/8082)、AJP port(如 8009/8010/8011,如使用 AJP)。
    • 示例(仅示意端口差异):
      • tomcat01:Server 8005、HTTP 8080、AJP 8009
      • tomcat02:Server 8006、HTTP 8081、AJP 8010
      • tomcat03:Server 8007、HTTP 8082、AJP 8011
  • 启动与验证
    • 分别在各实例 /bin 下执行:./startup.sh
    • 浏览器访问各实例 http://IP:端口 确认正常。

三 集群与会话复制配置

  • 方式A 内置集群 SimpleTcpCluster(推荐入门)
    • 在每个实例的 conf/server.xml 内加入(或确保存在)如下 片段(示例为常用参数):
      <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=""/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
      
    • 在应用的 META-INF/context.xmlconf/context.xml 上增加属性:distributable=“true”
    • 说明
      • 上述为“组播”发现与复制的典型配置;如跨网段或云环境,建议改用 StaticMembershipInterceptor 静态成员配置。
      • 复制阀(ReplicationValve)的 filter 可用于过滤静态资源,减少复制流量(如:“..gif;..js;..jpg;..png;..css;..html;.*.txt;”)。
  • 方式B 使用 AJP + Apache mod_jk(可选)
    • Tomcat 开启 AJP 连接器(如 8009),Apache 加载 mod_jk 并通过 workers.properties 定义后端节点与负载策略(支持 sticky_session)。

四 负载均衡配置示例

  • Nginx(HTTP 反向代理)
    • 安装后编辑 /etc/nginx/nginx.conf 的 http 段:
      upstream tomcat_cluster {
          server 192.168.1.11:8080;
          server 192.168.1.12:8080;
          server 192.168.1.13:8080;
          # 可选:ip_hash; 或 least_conn;
      }
      
      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;
          }
      }
      
    • 检查并重载:nginx -t && systemctl reload nginx
  • HAProxy(TCP/HTTP)
    • 示例 backend:
      backend tomcat_servers
        balance roundrobin
        server s1 192.168.1.11:8080 check
        server s2 192.168.1.12:8080 check
        server s3 192.168.1.13:8080 check
      
  • Apache + mod_jk(AJP)
    • workers.properties 示例:
      worker.list=loadbalancer,status
      worker.tomcat1.port=8009
      worker.tomcat1.host=192.168.1.11
      worker.tomcat1.type=ajp13
      worker.tomcat1.lbfactor=1
      
      worker.tomcat2.port=8009
      worker.tomcat2.host=192.168.1.12
      worker.tomcat2.type=ajp13
      worker.tomcat2.lbfactor=1
      
      worker.loadbalancer.type=lb
      worker.loadbalancer.balance_workers=tomcat1,tomcat2
      worker.loadbalancer.sticky_session=1
      worker.status.type=status
      
    • httpd.conf 中加载模块与挂载:
      LoadModule jk_module modules/mod_jk.so
      JkWorkersFile /path/to/workers.properties
      JkMount /* loadbalancer
      JkMount /jk-status status
      
    • 重启 Apache 生效。

五 启动、验证与运维要点

  • 启动顺序
    • 先启动所有 Tomcat 实例,再启动 Nginx/HAProxy/Apache
  • 验证集群与会话复制
    • 部署一个显示 JSESSIONID 的测试页,登录后刷新并交替访问不同后端节点,确认 JSESSIONID 不变(粘性会话)或变更后仍能保持登录(会话复制生效)。
    • 查看 catalina.out 与各实例 logs/localhost.log*,确认无集群成员发现/复制错误。
  • 防火墙与网络
    • 开放实例 HTTP/8080、集群通信端口(如 45564/4000 等)、负载均衡监听端口(如 80/443)。
    • 云环境需放行对应安全组规则。
  • 高可用增强(可选)
    • 在负载均衡层前增加 Keepalived/VRRP 实现 VIP 漂移,避免单点。
  • 常见问题
    • 端口冲突:多实例必须修改 Server/Connector/AJP 端口。
    • 应用未标记 distributable:会话不会复制。
    • 组播不通:跨网段/云环境改用 StaticMembershipInterceptor 或改用 AJP+mod_jk
    • 序列化问题:会话属性需实现 Serializable,避免存放不可序列化对象。

0