在开始部署前,需完成以下基础准备工作:
sudo apt update
sudo apt install openjdk-11-jdk -y
java -version # 验证安装(输出需包含Java版本信息)
sudo apt install tomcat9 tomcat9-admin -y
sudo systemctl enable --now tomcat9 # 启动Tomcat并设置开机自启
sudo systemctl status tomcat9 # 验证状态(需显示“active (running)”)
以上步骤确保所有节点具备运行Tomcat的基础环境。
server.xml配置集群集群的核心配置在server.xml文件中(路径:/etc/tomcat9/server.xml),需添加<Cluster>元素并配置相关参数:
<Engine name="Catalina" defaultHost="localhost">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<!-- 集群通信通道配置 -->
<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" # 自动获取本机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.MessageDispatch15Interceptor"/>
</Channel>
<!-- 会话管理器:负责会话复制 -->
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<!-- 阀门:过滤需要复制的请求 -->
<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>
关键参数说明:
address/port:多播地址和端口用于节点自动发现,同一集群内需保持一致;receiver.port:每个节点需设置为不同值(如4000、4001),避免端口冲突;DeltaManager:默认会话管理器,支持全量/增量会话复制。默认情况下,Tomcat会将webapps目录下的应用纳入集群会话复制。若需单独配置某个应用的会话复制,在应用的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>
每个Tomcat节点需修改以下端口(路径:/etc/tomcat9/server.xml):
<Server port="8006" shutdown="SHUTDOWN">(默认8005,集群内需唯一);<Connector port="8081" protocol="HTTP/1.1" ...>(默认8080,集群内需唯一);<Connector port="8010" protocol="AJP/1.3" ...>(默认8009,集群内需唯一)。修改后重启Tomcat使配置生效:
sudo systemctl restart tomcat9
负载均衡器负责将请求分发到集群中的Tomcat节点,提高系统吞吐量和可用性。以下是Nginx的配置步骤:
sudo apt update
sudo apt install nginx -y
sudo systemctl enable --now nginx
sudo systemctl status nginx # 验证状态
编辑Nginx配置文件(路径:/etc/nginx/sites-available/default),在http块中添加upstream:
http {
upstream tomcat_cluster {
server 192.168.1.101:8080; # Tomcat节点1地址
server 192.168.1.102:8080; # Tomcat节点2地址
# 可添加更多节点
}
server {
listen 80;
server_name yourdomain.com;
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;
}
}
}
sudo nginx -t # 测试配置语法
sudo systemctl restart nginx
为避免用户会话在节点间频繁切换,可开启会话粘滞:
upstream tomcat_cluster {
ip_hash; # 基于客户端IP分配固定节点
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
将WAR文件复制到每个Tomcat节点的webapps目录(如/var/lib/tomcat9/webapps/),Tomcat会自动解压部署:
scp your-app.war user@192.168.1.101:/var/lib/tomcat9/webapps/
scp your-app.war user@192.168.1.102:/var/lib/tomcat9/webapps/
http://yourdomain.com)访问应用;/cluster-info.jsp),输出request.getServerInfo()和session.getId(),验证请求是否分发到不同节点且会话一致;sudo systemctl stop tomcat9),再次访问应用,确认请求是否自动切换到其他节点。为避免单点故障(如Nginx宕机),可使用Keepalived配置虚拟IP(VIP):
sudo apt install keepalived -y
编辑配置文件(/etc/keepalived/keepalived.conf):
vrrp_instance VI_1 {
state MASTER
interface eth0 # 网卡名称(通过`ip a`查看)
virtual_router_id 51 # 虚拟路由ID(集群内唯一)
priority 100 # 优先级(MASTER需高于BACKUP)
advert_int 1 # 心跳间隔(秒)
authentication {
auth_type PASS
auth_pass 1234 # 密码(集群内一致)
}
virtual_ipaddress {
192.168.1.200 # VIP地址
}
}
启动Keepalived:
sudo systemctl enable --now keepalived
ip addr show eth0 # 查看VIP是否绑定
对于大型集群,Tomcat原生会话复制可能影响性能,建议使用Redis作为集中式会话存储:
sudo apt install redis-server -y;tomcat-redis-session-manager);context.xml配置Redis连接:<Context>
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.100" # Redis服务器地址
port="6379"
database="0"
maxInactiveInterval="1800"/>
</Context>
/var/log/tomcat9/catalina.out)和Nginx日志(/var/log/nginx/access.log),分析请求延迟和错误率;/etc/tomcat9/tomcat9.conf):JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
通过以上步骤,可在Ubuntu环境下搭建一个高可用的Tomcat集群,满足应用的负载均衡、会话共享和高可用需求。