如何在Linux上部署Tomcat集群
导读:Linux上部署Tomcat集群 一、架构与准备 架构建议:前端使用Nginx或Apache HTTP Server做负载均衡,后端部署2个及以上Tomcat实例组成集群,开启会话复制(DeltaManager 或 BackupManag...
Linux上部署Tomcat集群
一、架构与准备
- 架构建议:前端使用Nginx或Apache HTTP Server做负载均衡,后端部署2个及以上Tomcat实例组成集群,开启会话复制(DeltaManager 或 BackupManager),实现高可用与故障转移。
- 准备要点:
- 安装**JDK 8+**并配置环境变量(JAVA_HOME、PATH)。
- 安装Tomcat 9/10(建议同版本,便于一致性)。
- 同一台机器部署多实例时,修改各实例的Server、HTTP、AJP、shutdown端口避免冲突。
- 开放防火墙端口:HTTP/HTTPS、AJP(如使用)、以及集群通信端口(见下文)。
- 负载均衡器健康检查:HTTP 200/302 探测路径(如 /health)。
二、Tomcat节点集群配置
- 启用内置集群:在每个实例的 conf/server.xml 的 或 下加入 配置。示例(默认 DeltaManager,适合大多数场景):
<
Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<
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;
.*\.htm;
.*\.html;
.*\.css;
.*\.txt;
"/>
<
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>
- 关键参数说明:
- channelSendOptions:复制模式控制;8=异步(默认,性能更好),4=同步(可靠性更高),10=异步+ACK(在异步基础上增加确认,提高可靠性)。
- Manager:默认 DeltaManager(all-to-all 复制,适合节点少且应用一致);节点多或应用不一致可用 BackupManager(仅向部署了当前应用的节点复制,但成熟度不及 DeltaManager)。
- Membership:组播发现节点,同一集群需使用相同 address/port(如 228.0.0.4:45564)。
- Receiver:接收复制消息端口,默认从4000-4100自动选择;同机多实例需显式指定不同端口(如 4000、4001)。
- ReplicationValve.filter:对静态资源不触发复制,提升性能。
- 同一主机多实例端口规划示例(以 8080/8009 为基准,按规则偏移):
- 实例A:Server 8005,HTTP 8080,AJP 8009,Receiver 4000
- 实例B:Server 8006,HTTP 8081,AJP 8010,Receiver 4001
- 可选优化(BackupManager 示例,需保证各节点配置与应用尽量一致):
<
Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
- 应用侧要求:在应用的 WEB-INF/web.xml 中加入 ,并确保放入 session 的对象实现 Serializable 接口,否则复制会失败或不生效。
三、负载均衡器配置
- Nginx 示例(轮询,支持会话保持与被动健康检查):
upstream backend {
ip_hash;
# 会话保持(基于客户端IP)
server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.12:8080 max_fails=3 fail_timeout=30s;
# 健康检查(被动)
}
server {
listen 80;
location / {
proxy_pass http://backend;
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;
}
}
- Apache HTTP Server + mod_proxy_balancer 示例(开启会话粘滞):
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<
Proxy "balancer://mycluster">
BalancerMember "http://10.0.0.11:8080" route=node1
BalancerMember "http://10.0.0.12:8080" route=node2
ProxySet lbmethod=byrequests
ProxySet stickysession=JSESSIONID|jsessionid
<
/Proxy>
ProxyPass "/" "balancer://mycluster/"
ProxyPassReverse "/" "balancer://mycluster/"
- 如使用 mod_jk(AJP),需编译并加载 mod_jk.so,配置 workers.properties 定义节点与 AJP 端口,并在 httpd.conf 中 Include 相关配置。
四、启动与验证
- 启动顺序:先启动所有 Tomcat 实例,再启动 Nginx/Apache。
- 验证要点:
- 访问应用首页,确认返回 JSESSIONID(浏览器 Cookie 或响应头 Set-Cookie)。
- 登录后,在多个节点间切换(可通过负载均衡关闭某节点或临时停止实例),验证无需重复登录(会话粘滞或复制生效)。
- 查看各节点 catalina.out 与 localhost_access_log,确认请求分发与复制日志无异常。
- 常见故障排查:
- 节点互相发现失败:检查 组播 228.0.0.4:45564 是否被防火墙拦截,或同网段路由/交换设备限制组播。
- 同机多实例复制异常:确认 Receiver port 唯一且未被占用。
- 会话未复制:确认应用 web.xml 含 ,session 属性可序列化,且 ReplicationValve 未过滤相关请求路径。
- 会话粘滞失效:Nginx 使用 ip_hash 或基于 JSESSIONID 的路由;Apache 使用 stickysession=JSESSIONID|jsessionid。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何在Linux上部署Tomcat集群
本文地址: https://pptw.com/jishu/760140.html
