温馨提示×

Ubuntu下Tomcat的集群配置怎么做

小樊
38
2025-11-25 08:44:58
栏目: 智能运维

Ubuntu下Tomcat集群配置步骤

一 环境准备与端口规划

  • 准备至少2台 Ubuntu 服务器(同一内网),安装相同版本的 JDKTomcat
  • 每台机器上规划多个实例时,修改以下端口避免冲突:Server port(默认8005)HTTP Connector(默认8080)AJP Connector(默认8009)、以及集群通信的 Receiver port(默认4000)
  • 示例两台机器的实例端口规划如下(可按需调整):
节点 Server port HTTP AJP Receiver port
node1 8005 8080 8009 4000
node2 8006 8081 8010 4001
  • 建议所有节点时间同步(如配置 NTP),避免会话过期判断与集群建立异常。

二 配置Tomcat集群会话复制

  • 在每个节点的 conf/server.xml 内添加或启用 。示例(两台机器分别使用各自的 Receiver 端口):
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  <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>
</Engine>
  • 在需要会话复制的应用的 WEB-INF/web.xml 中添加
  • 放入会话的对象必须实现 java.io.Serializable
  • 如需在同一台机器运行多个实例,请确保各实例的 Receiver port 唯一,且 Engine 的 jvmRoute 唯一(如:tomcat1、tomcat2),便于后续粘性会话与路由。

三 配置负载均衡

  • 方案A(Apache + mod_jk,AJP)
    1. 安装模块:sudo apt-get install libapache2-mod-jk
    2. 编辑 workers.properties(示例为两台 AJP 节点):
    worker.list=loadbalancer,status
    worker.tomcat1.port=8009
    worker.tomcat1.host=192.168.1.10
    worker.tomcat1.type=ajp13
    worker.tomcat1.lbfactor=1
    
    worker.tomcat2.port=8010
    worker.tomcat2.host=192.168.1.11
    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
    
    1. 启用模块并配置 VirtualHost(示例):
    LoadModule jk_module modules/mod_jk.so
    JkWorkersFile /path/to/workers.properties
    JkLogFile /var/log/apache2/mod_jk.log
    JkLogLevel info
    
    <VirtualHost *:80>
      ServerName yourdomain.com
      JkMount /* loadbalancer
      JkMount /jk-status status
    </VirtualHost>
    
  • 方案B(Nginx,HTTP Proxy)
    1. 安装:sudo apt-get install nginx
    2. 配置 /etc/nginx/sites-available/cluster.conf:
    upstream tomcat_cluster {
      server 192.168.1.10:8080;
      server 192.168.1.11:8081;
    }
    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;
      }
    }
    
    1. 启用站点并重启 Nginx。

四 启动与验证

  • 启动所有 Tomcat 实例,再启动 Apache/ Nginx
  • 访问应用,观察日志(catalina.out、mod_jk.log 或 nginx/access.log)确认请求被分发到不同节点。
  • 验证会话复制:
    • 在应用首页打印 JSESSIONID,刷新后检查是否保持同一会话或按策略变更;
    • 关闭当前承载会话的节点,确认请求被其他节点接管且会话未丢失(粘性会话或外置 Session 存储生效时更明显);
    • 使用 PSI Probe 等工具查看集群节点与会话状态。

五 常见问题与优化

  • 组播不通:确认云环境未屏蔽 IGMP/组播,或改用 静态成员(StaticMembershipInterceptor);检查 address=228.0.0.4、port=45564 在各节点一致且网络可达。
  • Receiver 绑定错误:将 Receiver address 设为非 127.0.0.1 的本机地址,确保多实例端口不冲突。
  • 时间漂移:配置 NTP 同步所有节点时间。
  • 会话可序列化:所有放入 HttpSession 的对象实现 Serializable
  • 应用分发:为需要复制的应用添加
  • 会话保持策略:
    • 使用 粘性会话(如 mod_jk 的 sticky_session=1)可减少复制量,但节点宕机会丢失该节点上的会话;
    • 使用 外置 Session 存储(如 Memcached)可实现会话共享与故障不丢。

0