centos

CentOS Tomcat集群搭建方法

小樊
47
2025-10-13 04:38:12
栏目: 智能运维

CentOS环境下Tomcat集群搭建步骤

1. 准备工作

2. 安装Tomcat

在所有节点执行相同操作:

# 下载Tomcat(以9.0.56为例)
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.tar.gz
# 解压到/opt目录
sudo tar xzf apache-tomcat-9.0.56.tar.gz -C /opt
# 重命名目录(可选)
sudo mv /opt/apache-tomcat-9.0.56 /opt/tomcat
# 创建软链接(方便管理多版本)
sudo ln -s /opt/tomcat /opt/tomcat_cluster

配置环境变量(全局生效):

echo 'export CATALINA_HOME="/opt/tomcat_cluster"' >> /etc/profile
echo 'export PATH=$PATH:$CATALINA_HOME/bin' >> /etc/profile
source /etc/profile

3. 配置Tomcat集群

3.1 修改server.xml(核心配置)

编辑$CATALINA_HOME/conf/server.xml,在<Engine>标签内添加集群配置(关键参数说明见注释):

<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> <!-- jvmRoute需唯一标识节点(如node1、node2) -->
  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
    <!-- 会话管理器(DeltaManager用于全量复制,适合小集群) -->
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true"/>
    <!-- 集群通信通道 -->
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
      <!-- 组播服务(节点发现):address为组播IP(228.0.0.0-239.255.255.255),port为组播端口 -->
      <Membership className="org.apache.catalina.tribes.membership.McastService"
                  address="228.0.0.4"
                  port="45564"
                  frequency="500"  <!-- 心跳频率(ms) -->
                  dropTime="3000"/> <!-- 节点失联判定时间(ms) -->
      <!-- 接收器(接收其他节点消息) -->
      <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.TcpFailureDetector"/> <!-- 检测节点故障 -->
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> <!-- 消息分发优化 -->
    </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>

3.2 修改context.xml(启用会话复制)

编辑$CATALINA_HOME/conf/context.xml,添加<Cluster>标签:

<Context>
  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
</Context>

4. 配置负载均衡器(Nginx为例)

在一台单独的服务器(或集群中的某节点)安装Nginx:

sudo yum install epel-release -y
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx

修改Nginx配置(/etc/nginx/nginx.conf),添加upstream模块:

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;
        }
    }
}

重启Nginx:

sudo systemctl restart nginx

5. 启动集群并验证

5.1 启动Tomcat

在所有Tomcat节点上执行:

cd $CATALINA_HOME/bin
./startup.sh

通过ps -ef | grep tomcat确认进程运行,tail -f $CATALINA_HOME/logs/catalina.out查看日志。

5.2 验证集群状态

6. 可选:配置会话持久化(数据库/Redis)

若需长期保存会话或跨集群共享,可将会话存储到数据库(MySQL)或Redis:

注意事项

0
看了该问题的人还看了