在开始配置前,需完成以下基础准备工作:
sudo apt update && sudo apt install openjdk-11-jdk -y,验证安装:java -version。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。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>
在需要集群部署的应用的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>
所有存入HttpSession的对象必须实现java.io.Serializable接口,否则无法同步会话数据。例如:
public class UserSession implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String role;
// getters and setters
}
在单独的服务器(或其中一个Tomcat节点)上安装Nginx:
sudo apt update
sudo apt install nginx -y
编辑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;
}
}
}
若应用需要保持用户会话(如购物车),可在upstream块中添加ip_hash指令,使同一用户的请求始终转发到同一Tomcat节点:
upstream tomcat_cluster {
ip_hash; # 会话保持
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
验证Nginx配置语法:sudo nginx -t,若无错误则重载配置:sudo systemctl reload nginx。
在每个Tomcat节点上,进入/opt/tomcat/bin目录,启动Tomcat:
cd /opt/tomcat/bin
./startup.sh
http://192.168.1.101:8080/manager/html),登录后查看“集群”栏目,应显示所有节点已加入集群。ntp服务同步时间:sudo apt install ntp -y。server.xml中的address参数未被其他应用占用,若有冲突可更换为其他地址(如228.0.0.5)。Serializable接口的对象会导致会话同步失败,需检查应用代码。