在Debian下搭建Tomcat集群的步骤
确保所有Debian服务器已更新至最新版本,并安装Java环境(Tomcat依赖Java运行):
sudo apt update && sudo apt upgrade -y
sudo apt install openjdk-11-jdk -y # 推荐使用OpenJDK 11及以上版本
在每台服务器上安装Tomcat(以Tomcat 9为例,版本需保持一致):
sudo apt install tomcat9 tomcat9-admin -y
安装完成后,Tomcat会自动启动,可通过systemctl status tomcat9
验证状态。
server.xml
(启用集群通信)每台Tomcat的/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" # 心跳发送间隔(ms)
dropTime="30000"/> # 节点失联判定时间(ms)
<!-- 接收器(非阻塞式,提升性能) -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" # 自动获取本机IP
port="4000" # 接收端口(每台服务器需唯一)
autoBind="100" # 端口范围(如4000-4099)
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"/>
</Channel>
<!-- 会话复制阀门(仅复制符合规则的请求) -->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.css"/> # 排除静态资源
<!-- 会话ID绑定(确保会话一致性) -->
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<!-- 部署器(支持集群内应用同步部署) -->
<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>
context.xml
(启用分布式会话)每台Tomcat的/etc/tomcat9/context.xml
需添加<Manager>
元素,指定会话管理方式为DeltaManager
(适用于小型集群,会话同步到所有节点):
<Context>
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
</Context>
jvmRoute
(唯一标识节点)每台Tomcat的/etc/tomcat9/server.xml
中,<Engine>
元素需添加jvmRoute
属性(如node1
、node2
),用于标识节点:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> # node1需唯一
选择一台服务器安装Nginx作为负载均衡器,将请求分发到各Tomcat节点:
sudo apt install nginx -y
编辑Nginx配置文件(/etc/nginx/sites-available/default
),添加upstream
模块:
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 your_domain.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 restart nginx
在每台服务器上启动Tomcat服务,并设置开机自启:
sudo systemctl start tomcat9
sudo systemctl enable tomcat9
验证Tomcat是否运行:
curl http://localhost:8080
访问任意Tomcat节点的管理页面(http://<节点IP>:8080/manager/html
),登录后查看“集群”栏目,应显示所有节点已加入集群。
部署一个简单的Web应用(如session-test.war
),包含以下代码:
<%@ page session="true" %>
<html>
<body>
<h1>Session ID: <%= session.getId() %></h1>
<h2>Session Value: <%= session.getAttribute("test") %></h2>
<form method="post" action="">
<input type="text" name="value" placeholder="Enter a value">
<button type="submit">Submit</button>
</form>
</body>
</html>
通过Nginx访问应用,提交表单后刷新页面,检查Session ID是否一致(表示会话已复制)。
Connector
端口(如8080、8081)、AJP
端口(如8009、8010)和Receiver
端口(如4000、4001),避免冲突。228.0.0.4
)和端口(45564
)未被防火墙拦截,或改用静态成员列表(修改Membership
为StaticMember
)。DeltaManager
(需添加tomcat-redis-session-manager
依赖)。