温馨提示×

Ubuntu中Tomcat集群如何搭建

小樊
34
2025-11-09 11:13:35
栏目: 智能运维

Ubuntu环境下搭建Tomcat集群的详细步骤

1. 准备工作

  • 服务器要求:至少2台Ubuntu服务器(物理机或虚拟机),确保网络互通(建议使用私有网络,避免防火墙拦截集群通信端口)。
  • 软件准备:下载Tomcat(建议版本8.5+或9.x,需所有节点版本一致)、JDK(1.8+,需配置环境变量JAVA_HOME)。
  • 基础配置:每台服务器需安装并配置JDK(通过java -version验证),并解压Tomcat到指定目录(如/opt/tomcat)。

2. 安装与基础配置Tomcat

  • 解压Tomcat:在每台服务器上执行tar -zxvf apache-tomcat-x.x.x.tar.gz -C /opt/,重命名为tomcat(便于管理)。
  • 配置环境变量:编辑/etc/profile,添加export CATALINA_HOME=/opt/tomcat,执行source /etc/profile生效。
  • 修改端口:为避免节点间端口冲突,需修改每台服务器的conf/server.xml中的以下端口(示例为两台节点的配置差异):
    • 节点1Server Port=8005Connector Port=8080AJP Port=8009
    • 节点2Server Port=9005Connector Port=9080AJP Port=9009(确保端口不重复)。

3. 配置Tomcat集群(核心步骤)

编辑每台服务器conf/server.xml文件,在<Engine>标签内添加集群配置(关键参数说明见注释):

<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> <!-- jvmRoute需唯一,对应负载均衡节点标识 -->
  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
    <!-- 会话管理器:DeltaManager用于主节点复制,BackupManager用于备份节点 -->
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true"/>
    
    <!-- 集群通信通道:组播(Multicast)用于节点发现 -->
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
      <!-- 组播地址(224.0.0.0-239.255.255.255)和端口,所有节点需一致 -->
      <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" <!-- 自动获取本机IP -->
                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.TcpPingInterceptor"/>
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    </Channel>
    
    <!-- 负载均衡阀:控制请求是否复制到其他节点 -->
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
           filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.css;.*\.txt"/> <!-- 过滤静态资源,减少复制开销 -->
    
    <!-- 部署器:同步war包到集群节点(可选,建议手动部署) -->
    <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>
</Engine>
  • 关键说明
    • jvmRoute:每台节点需唯一(如node1node2),对应负载均衡配置中的balance_workers名称;
    • 组播地址:确保所有节点在同一网段,且防火墙允许该地址的UDP通信(端口45564);
    • 接收器端口:每台节点需唯一(如40004001),避免端口冲突。

4. 启用应用会话复制

为了让应用支持集群会话同步,需在应用的WEB-INF/web.xml文件中添加<distributable/>标签(示例):

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <distributable/> <!-- 启用会话复制 -->
</web-app>
  • 注意事项:仅标注<distributable/>的应用会话才会被复制,未标注的应用会话仅在当前节点有效。

5. 配置负载均衡(以Nginx为例)

Tomcat集群需要负载均衡器将请求分发到各节点,以下是Nginx的配置步骤:

  • 安装Nginx:执行sudo apt update && sudo apt install nginx
  • 配置负载均衡:编辑/etc/nginx/sites-available/default,添加以下内容:
upstream tomcat_cluster {
  server 192.168.1.101:8080; # 节点1的IP和Tomcat端口
  server 192.168.1.102:9080; # 节点2的IP和Tomcat端口
  # 可添加更多节点
}

server {
  listen 80;
  server_name yourdomain.com; # 替换为你的域名或IP

  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;
  }
}
  • 启用配置:执行sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/,然后重启Nginx:sudo systemctl restart nginx

6. 启动集群并验证

  • 启动Tomcat:在每台服务器上执行/opt/tomcat/bin/startup.sh,通过ps -ef | grep tomcat验证进程是否启动。
  • 查看集群状态:访问http://节点IP:8080/manager/status(需输入管理员账号密码),查看“Cluster”栏目中的节点列表(显示所有节点已加入集群)。
  • 测试会话同步
    1. 访问http://yourdomain.com(通过Nginx负载均衡),登录应用并记录Session ID;
    2. 关闭当前节点的Tomcat(如/opt/tomcat/bin/shutdown.sh);
    3. 刷新页面,若仍能保持登录状态且Session ID变化,说明会话复制成功。

7. 可选优化

  • 静态资源分离:将CSS、JS、图片等静态资源放在Nginx或其他CDN服务器,减少Tomcat负载;
  • 会话持久化:将会话存储到Redis(需添加Redisson依赖),避免节点宕机导致会话丢失;
  • 监控报警:使用Prometheus+Granafa监控Tomcat集群的CPU、内存、会话数等指标,设置报警阈值。

通过以上步骤,即可在Ubuntu环境下搭建一个基本的Tomcat集群,实现负载均衡和高可用性。根据实际需求,可进一步调整集群配置(如优化组播参数、调整复制模式)以满足高并发场景。

0