温馨提示×

Ubuntu Tomcat集群配置教程

小樊
51
2025-09-20 13:24:58
栏目: 智能运维

Ubuntu Tomcat集群配置教程

1. 环境准备

在开始配置前,需完成以下基础准备工作:

  • 服务器要求:至少2台Ubuntu服务器(物理机或虚拟机),建议使用Ubuntu 22.04 LTS及以上版本以保证稳定性。
  • Java环境:Tomcat依赖Java运行环境,需在所有节点安装相同版本的JDK(推荐OpenJDK 11或17)。安装命令:sudo apt update && sudo apt install openjdk-11-jdk -y,验证安装:java -version
  • Tomcat安装:在所有节点下载并解压相同版本的Tomcat(推荐Tomcat 9或10)。例如:wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.87/bin/apache-tomcat-9.0.87.tar.gz,解压后移动至/opt/tomcat目录:sudo mv apache-tomcat-9.0.87 /opt/tomcat
  • 网络要求:所有节点之间需能互相通信(关闭防火墙或开放相关端口:8080(Tomcat)、8009(AJP)、4000(集群通信))。

2. 配置Tomcat集群

2.1 修改server.xml启用集群

进入/opt/tomcat/conf目录,编辑server.xml文件(备份原文件后再修改)。在<Engine>标签内添加集群配置,关键参数说明:

  • address="228.0.0.4":集群通信的多播地址(需确保所有节点在同一网段且未被占用);
  • port="45564":多播端口;
  • fork="true":启用异步复制,提升性能;
  • className="org.apache.catalina.ha.session.DeltaManager":会话管理器,用于同步会话数据。

示例配置:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> <!-- jvmRoute需唯一,如tomcat1、tomcat2 -->
  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
    <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.TcpPingInterceptor"/>
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    </Channel>
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
    <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>

2.2 配置应用支持集群

在需要集群部署的应用的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_4_0.xsd"
         version="4.0">
  <distributable/>
</web-app>

2.3 确保会话对象可序列化

所有存入HttpSession的对象必须实现java.io.Serializable接口,否则无法同步会话数据。例如:

public class UserSession implements Serializable {
    private static final long serialVersionUID = 1L;
    private String username;
    private String role;
    // getters and setters
}

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

3.1 安装Nginx

在单独的服务器(或其中一个Tomcat节点)上安装Nginx:

sudo apt update
sudo apt install nginx -y

3.2 配置Nginx上游服务器组

编辑Nginx配置文件(/etc/nginx/nginx.conf/etc/nginx/conf.d/tomcat.conf),添加upstream块定义Tomcat集群节点:

http {
    upstream tomcat_cluster {
        server 192.168.1.101:8080; # Tomcat节点1的IP和端口
        server 192.168.1.102:8080; # Tomcat节点2的IP和端口
        # 可添加更多节点
    }

    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;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

3.3 启用会话保持(可选)

若应用需要保持用户会话(如购物车),可在upstream块中添加ip_hash指令,使同一用户的请求始终转发到同一Tomcat节点:

upstream tomcat_cluster {
    ip_hash; # 会话保持
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

3.4 测试并重载Nginx

验证Nginx配置语法:sudo nginx -t,若无错误则重载配置:sudo systemctl reload nginx

4. 启动集群并验证

4.1 启动Tomcat实例

在每个Tomcat节点上,进入/opt/tomcat/bin目录,启动Tomcat:

cd /opt/tomcat/bin
./startup.sh

4.2 验证集群状态

  • 查看集群成员:访问任意Tomcat节点的管理页面(如http://192.168.1.101:8080/manager/html),登录后查看“集群”栏目,应显示所有节点已加入集群。
  • 测试会话同步:在应用中创建会话(如登录操作),访问不同Tomcat节点,验证会话数据是否同步。
  • 测试负载均衡:通过Nginx域名访问应用,多次刷新页面,观察请求是否被分发到不同Tomcat节点(可通过节点首页的不同内容区分)。

5. 注意事项

  • 时间同步:集群节点时间差过大会导致会话同步失败,需安装ntp服务同步时间:sudo apt install ntp -y
  • 多播地址冲突:确保server.xml中的address参数未被其他应用占用,若有冲突可更换为其他地址(如228.0.0.5)。
  • 会话对象序列化:未实现Serializable接口的对象会导致会话同步失败,需检查应用代码。
  • 高可用扩展:若需更高的可用性,可结合Keepalived实现Nginx的高可用,或使用Redis集群替代Tomcat原生会话复制(适用于大规模集群)。

0