Tomcat集群配置方法(以CentOS为例)
Tomcat集群通过负载均衡和会话复制实现高可用性与可伸缩性,核心步骤包括环境准备、Tomcat配置、负载均衡设置及验证。
安装Java环境
所有集群节点需安装与Tomcat兼容的JDK(如OpenJDK 1.8/11),以CentOS为例执行:
sudo yum install java-1.8.0-openjdk-devel -y
验证安装:java -version,需显示JDK版本信息。
下载并安装Tomcat
在所有节点下载相同版本的Tomcat(如9.0.56),解压至指定目录(如/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
配置环境变量(可选,方便全局调用):编辑/etc/profile,添加:
export CATALINA_HOME=/opt/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
source /etc/profile
启动Tomcat:/opt/tomcat/bin/startup.sh,验证端口8080是否监听:netstat -tulnp | grep 8080。
修改server.xml(核心配置)
编辑/opt/tomcat/conf/server.xml,在<Engine>元素内添加集群配置,关键参数说明:
MulticastService:通过组播地址(228.0.0.4)和端口(45564)实现节点发现;NioReceiver:接收其他节点的复制数据,端口4000;ReplicationTransmitter:使用NIO并行发送数据,提升复制效率;DeltaManager:管理会话复制,默认将所有会话存入内存,notifyListenersOnReplication="true"确保复制完成后通知监听器。<Engine name="Catalina" defaultHost="localhost">
<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.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"/> <!-- 过滤静态资源,减少复制开销 -->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
</Engine>
(可选)配置context.xml
编辑/opt/tomcat/conf/context.xml,添加集群配置以启用分布式会话:
<Context>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
</Context>
使用Nginx将客户端请求分发到Tomcat集群,提升并发处理能力。
安装Nginx
sudo yum install epel-release -y
sudo yum install nginx -y
配置负载均衡
编辑/etc/nginx/nginx.conf,在http块中添加upstream定义集群节点(替换为实际IP),并配置proxy_pass转发请求:
http {
upstream tomcat_cluster {
server 192.168.1.1:8080; # Tomcat节点1
server 192.168.1.2:8080; # Tomcat节点2
server 192.168.1.3:8080; # Tomcat节点3
}
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;
}
}
}
启动Nginx
sudo systemctl start nginx
sudo systemctl enable nginx # 开机自启
检查Tomcat集群状态
访问任意节点的管理页面(如http://192.168.1.1:8080/manager/status),需输入管理员账号密码(在conf/tomcat-users.xml中配置),查看“Cluster”栏目,确认节点已加入集群(显示集群名称及成员列表)。
测试会话复制
部署一个包含HttpSession操作的Web应用(如session.jsp,内容为<%= session.getId() %>),通过Nginx访问(如http://yourdomain.com/session.jsp)。刷新页面时,观察不同节点返回的Session ID是否一致,若一致则说明会话复制成功。
验证负载均衡
多次访问http://yourdomain.com,通过netstat -tulnp | grep 8080查看请求是否被分发到不同Tomcat节点(端口8080的连接数应分布在多个节点上)。
8080)、Nginx(80)及组播端口(45564)的流量:sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=45564/tcp --permanent
sudo firewall-cmd --reload