温馨提示×

Ubuntu Tomcat集群部署指南

小樊
41
2025-10-28 17:04:39
栏目: 智能运维

Ubuntu Tomcat集群部署指南

一、准备工作

在开始部署前,需完成以下基础准备:

  1. 服务器环境:至少2台Ubuntu服务器(或同一服务器上的多个Tomcat实例,需配置不同端口),确保网络互通。
  2. 软件版本:推荐使用Tomcat 9及以上版本(兼容性好、性能更优)、JDK 8或11(Tomcat 9+要求JDK 8+)。
  3. 基础工具wget(下载软件)、unzip(解压文件)、vim(编辑配置)等,可通过sudo apt update && sudo apt install -y wget unzip vim安装。

二、安装与配置Tomcat实例

1. 下载并安装Tomcat

在所有集群节点上执行以下步骤:

# 下载Tomcat(以9.0.87为例)
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.87/bin/apache-tomcat-9.0.87.tar.gz
# 解压到/opt目录
sudo tar -zxvf apache-tomcat-9.0.87.tar.gz -C /opt
# 重命名目录(可选)
sudo mv /opt/apache-tomcat-9.0.87 /opt/tomcat-cluster-node1

重复上述步骤,下载并解压到不同目录(如/opt/tomcat-cluster-node2),用于创建多个Tomcat实例。

2. 配置环境变量

编辑/etc/profile文件,添加Tomcat环境变量:

export CATALINA_HOME=/opt/tomcat-cluster-node1  # 当前节点的Tomcat路径
export PATH=$CATALINA_HOME/bin:$PATH

使配置生效:

source /etc/profile

3. 修改端口避免冲突

每个Tomcat实例需使用不同端口,编辑conf/server.xml

<!-- 修改关闭端口(默认8005) -->
<Server port="8005" shutdown="SHUTDOWN">
<!-- 修改HTTP连接器端口(默认8080) -->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<!-- 修改AJP连接器端口(默认8009,用于负载均衡) -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!-- 修改Shutdown命令(避免误操作) -->
<Server port="8006" shutdown="CUSTOM_SHUTDOWN">

4. 启用集群配置

编辑conf/server.xml,在<Engine>标签内添加集群配置:

<Engine name="Catalina" defaultHost="localhost" jmxEnabled="true">
  <!-- 集群配置 -->
  <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">
      <!-- 组播服务(用于节点发现,同一集群需保持一致) -->
      <Membership className="org.apache.catalina.tribes.membership.McastService"
                  address="228.0.0.4"  # 组播地址224.0.0.0-239.255.255.255port="45564"        # 组播端口
                  frequency="500"     # 心跳频率毫秒dropTime="3000"/>   # 节点失效判定时间(毫秒)
      <!-- 接收器(接收其他节点消息) -->
      <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="auto"        # 自动获取本机IP
                port="4000"           # 接收端口每个节点需唯一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.MessageDispatch15Interceptor"/>
    </Channel>
    <!-- 复制阀(过滤不需要复制的请求,如静态资源) -->
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
           filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.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>

5. 标记可分布应用

在需要会话复制的应用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>

三、配置负载均衡(以Nginx为例)

1. 安装Nginx

sudo apt update
sudo apt install -y nginx

2. 配置负载均衡

编辑/etc/nginx/sites-available/default,添加以下内容:

upstream tomcat_cluster {
    # 轮询策略(默认)
    server 192.168.1.101:8080;  # Tomcat节点1的IP和端口
    server 192.168.1.102:8080;  # Tomcat节点2的IP和端口
    # 可选:权重策略(weight=2表示分配2倍请求)
    # server 192.168.1.103:8080 weight=2;
}

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://tomcat_cluster;  # 转发到Tomcat集群
        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/
sudo nginx -t  # 测试配置语法
sudo systemctl restart nginx

四、启动集群并测试

1. 启动所有Tomcat实例

在每个节点上执行:

/opt/tomcat-cluster-node1/bin/startup.sh  # 启动节点1
/opt/tomcat-cluster-node2/bin/startup.sh  # 启动节点2

检查进程是否运行:

ps -ef | grep tomcat

2. 验证集群功能

  • 节点发现:访问http://192.168.1.101:8080/manager/html(需提前配置Tomcat管理账号),查看“Cluster”栏目,应显示所有节点。
  • 会话复制:在应用中登录账号,关闭其中一个Tomcat节点,刷新页面应保持登录状态(说明会话已复制到其他节点)。

五、常见问题排查

  1. 组播无法通信
    • 检查Ubuntu防火墙是否允许组播流量:sudo ufw allow proto igmp to 228.0.0.4 port 45564
    • 确认所有节点的address(组播地址)和port(组播端口)一致。
  2. 节点无法加入集群
    • 检查server.xml中的address(接收器IP)是否设置为auto或正确本机IP。
    • 查看Tomcat日志(logs/catalina.out),定位具体错误(如端口冲突、网络不通)。
  3. 会话不复制
    • 确认应用web.xml中包含<distributable/>标签。
    • 检查ReplicationValvefilter配置,确保动态请求(如JSP、Servlet)被过滤。

通过以上步骤,即可在Ubuntu上完成Tomcat集群部署,实现负载均衡与会话共享。根据实际需求,可进一步优化配置(如调整线程池大小、启用JMX监控、使用Memcached持久化会话等)。

0