在开始部署前,需完成以下基础准备:
wget(下载软件)、unzip(解压文件)、vim(编辑配置)等,可通过sudo apt update && sudo apt install -y wget unzip vim安装。在所有集群节点上执行以下步骤:
# 下载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实例。
编辑/etc/profile文件,添加Tomcat环境变量:
export CATALINA_HOME=/opt/tomcat-cluster-node1 # 当前节点的Tomcat路径
export PATH=$CATALINA_HOME/bin:$PATH
使配置生效:
source /etc/profile
每个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">
编辑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.255)
port="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>
在需要会话复制的应用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>
sudo apt update
sudo apt install -y nginx
编辑/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
在每个节点上执行:
/opt/tomcat-cluster-node1/bin/startup.sh # 启动节点1
/opt/tomcat-cluster-node2/bin/startup.sh # 启动节点2
检查进程是否运行:
ps -ef | grep tomcat
http://192.168.1.101:8080/manager/html(需提前配置Tomcat管理账号),查看“Cluster”栏目,应显示所有节点。sudo ufw allow proto igmp to 228.0.0.4 port 45564。address(组播地址)和port(组播端口)一致。server.xml中的address(接收器IP)是否设置为auto或正确本机IP。logs/catalina.out),定位具体错误(如端口冲突、网络不通)。web.xml中包含<distributable/>标签。ReplicationValve的filter配置,确保动态请求(如JSP、Servlet)被过滤。通过以上步骤,即可在Ubuntu上完成Tomcat集群部署,实现负载均衡与会话共享。根据实际需求,可进一步优化配置(如调整线程池大小、启用JMX监控、使用Memcached持久化会话等)。