CentOS下Tomcat集群搭建步骤
sudo yum install java-1.8.0-openjdk-devel
,安装完成后通过java -version
验证。/opt/tomcat
)。wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.tar.gz
tar -xzf apache-tomcat-9.0.56.tar.gz
sudo mv apache-tomcat-9.0.56 /opt/tomcat
server.xml
(核心集群配置)编辑/opt/tomcat/conf/server.xml
,在<Engine>
标签内添加<Cluster>
配置,启用集群通信、会话管理及故障检测:
<Engine name="Catalina" defaultHost="localhost">
<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"
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.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<!-- 会话复制阀(仅复制特定路径请求) -->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.css;.*\.txt"/>
<!-- 部署器(支持应用自动同步到集群节点) -->
<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>
说明:
McastService
:通过组播(Multicast)实现节点自动发现,address
为组播地址(默认228.0.0.4),port
为组播端口;NioReceiver
:非阻塞IO接收器,提升通信性能;TcpFailureDetector
:自动检测节点宕机,从集群中移除故障节点。context.xml
(启用集群会话)编辑/opt/tomcat/conf/context.xml
,在<Context>
标签内添加集群配置,确保会话数据同步:
<Context>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
</Context>
说明:此配置使应用支持分布式会话,用户会话数据会在集群节点间同步。
将应用打包为WAR文件,部署到每个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_3_1.xsd"
version="3.1">
<distributable/>
</web-app>
说明:<distributable/>
标签告知Tomcat该应用需启用集群特性(如会话复制)。
Tomcat集群需通过负载均衡器分发请求,以下以Nginx为例:
执行命令:
sudo yum install epel-release
sudo yum install nginx
安装完成后启动Nginx:sudo systemctl start nginx
,并设置开机自启:sudo systemctl enable nginx
。
编辑/etc/nginx/nginx.conf
,在http
块中添加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 192.168.1.103:8080; # Tomcat节点3 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
:定义集群节点列表,Nginx默认采用轮询算法分发请求;proxy_set_header
:传递客户端真实IP、协议等信息至Tomcat,确保应用获取正确请求信息。执行命令:sudo systemctl start nginx
,并设置开机自启:sudo systemctl enable nginx
。
在每个节点上进入Tomcat的bin
目录,执行启动命令:
cd /opt/tomcat/bin
./startup.sh
启动后通过ps -ef | grep tomcat
验证进程是否存在,通过tail -f logs/catalina.out
查看启动日志。
http://192.168.1.101:8080/manager/html
),查看“集群”栏目,确认所有节点已加入集群;HttpSession
操作的测试应用(如计数器),通过负载均衡器访问,验证不同节点间的会话数据是否同步;sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload
RedissonSessionManager
)。server.xml
中的channelSendOptions
(如设置为8,启用异步复制)、maxThreads
(增加接收线程数)等参数,提升集群吞吐量。