Tomcat在Ubuntu中如何进行集群配置
导读:Ubuntu下搭建 Tomcat 集群的标准做法 一 环境准备与约定 准备至少2台 Ubuntu 服务器(同一内网),安装相同版本的 JDK 与 Tomcat。 规划实例端口:每个节点需确保 SHUTDOWN、HTTP、AJP、Rece...
Ubuntu下搭建 Tomcat 集群的标准做法
一 环境准备与约定
- 准备至少2台 Ubuntu 服务器(同一内网),安装相同版本的 JDK 与 Tomcat。
- 规划实例端口:每个节点需确保 SHUTDOWN、HTTP、AJP、Receiver 端口互不冲突;同一台机器跑多个实例时尤其要注意。
- 统一主机名解析:在 /etc/hosts 为各节点配置主机名与内网 IP,保证 InetAddress.getLocalHost().getHostAddress() 返回非 127.0.0.1 的地址,避免集群通信异常。
- 时间同步:所有节点启用 NTP 时间同步,避免因时间漂移导致会话过期判断异常或集群不稳定。
- 防火墙放行:开放 AJP 8009(如使用 AJP)、HTTP 8080、以及集群通信端口(见下文的 Receiver 端口 与 组播 45564/UDP)。
二 配置 Tomcat 集群与会话复制
-
方式 A 快速默认集群(适合节点数较少,如少于10台)
- 在 $CATALINA_HOME/conf/server.xml 的 中取消注释或新增:
< Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> - 将需要会话复制的应用在其 WEB-INF/web.xml 中加入:
< distributable/> - 确保放入 Session 的对象实现 java.io.Serializable。以上即可完成最简集群与会话复制。
- 在 $CATALINA_HOME/conf/server.xml 的 中取消注释或新增:
-
方式 B 显式配置(可控性与可观测性更好)
- 在 内添加如下 Cluster 配置,按需调整端口与网卡:
< 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.MessageDispatchInterceptor"/> < /Channel> < Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> < ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> < /Cluster> - 关键说明:
- Membership 使用组播 228.0.0.4:45564/UDP 发现成员;跨机房或云环境若无组播,可改用 StaticMembershipInterceptor 静态配置成员。
- Receiver port=“4000” 为接收复制消息端口,同一物理机多实例需改为不同端口。
- Manager 可用 DeltaManager(全量复制,适合小集群)或 BackupManager(备份复制,适合较大集群)。
- 将需要会话复制的应用加入 ,并确保会话属性对象可序列化。
- 在 内添加如下 Cluster 配置,按需调整端口与网卡:
三 配置负载均衡
-
方案 1 Apache HTTP Server + mod_jk(AJP)
- 安装模块:sudo apt-get install libapache2-mod-jk
- 配置 workers.properties(示例为两台节点):
worker.list=loadbalancer,status worker.tomcat1.port=8009 worker.tomcat1.host=192.168.0.11 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor=1 worker.tomcat2.port=8009 worker.tomcat2.host=192.168.0.12 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor=1 worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=tomcat1,tomcat2 worker.loadbalancer.sticky_session=1 worker.status.type=status - 启用模块并配置 mod_jk:
a2enmod jk # /etc/apache2/mods-enabled/jk.conf 或 apache2.conf 中 LoadModule jk_module modules/mod_jk.so JkWorkersFile /path/to/workers.properties JkLogFile /var/log/apache2/mod_jk.log JkLogLevel info < VirtualHost *:80> ServerName yourdomain.com JkMount /* loadbalancer JkMount /jk-status status < /VirtualHost> - 重启 Apache:sudo systemctl restart apache2。
-
方案 2 Nginx 或 HAProxy(HTTP)
- Nginx 示例(HTTP 轮询):
upstream backend { server 192.168.0.11:8080; server 192.168.0.12:8080; # 如需会话保持(粘性会话),可添加:ip_hash; } server { listen 80; location / { proxy_pass http://backend; } } - HAProxy 示例(HTTP 轮询):
frontend http-in bind *:80 default_backend servers backend servers balance roundrobin server s1 192.168.0.11:8080 check server s2 192.168.0.12:8080 check - 提示:使用 HTTP 代理时,Tomcat 侧通常无需开启 AJP;使用 AJP 时选择 mod_jk 更常见。
- Nginx 示例(HTTP 轮询):
四 部署与验证
- 部署应用:将应用(已加入 )部署到各节点的 webapps,或统一共享目录;确保应用会话对象可序列化。
- 启动顺序:先启动所有 Tomcat 实例,再启动 Apache/Nginx/HAProxy。
- 验证要点:
- 访问应用,观察日志是否出现 JOINED/MESSAGE 等集群事件;使用 PSI Probe 等工具查看节点与会话状态。
- 会话粘性与复制:
- 使用 mod_jk + sticky_session=1 时,刷新页面 JSESSIONID 后缀通常不变;关闭当前节点后,若会话仍可用,说明会话复制生效(或会话保持生效)。
- 关闭 sticky_session 或节点宕机后仍能保持登录,说明会话复制在集群内生效。
- 组播连通性(如采用组播发现):在节点上抓包或利用工具测试 228.0.0.4:45564/UDP 的收发,确保网络与防火墙策略允许。
五 常见问题与优化
- 节点无法互相发现
- 检查 组播地址/端口 一致、网络与防火墙放行 45564/UDP;云环境若无组播,改用 StaticMembershipInterceptor 静态成员配置。
- 确认 Receiver address 为本机非 127.0.0.1 的 IP,且多实例 Receiver port 不冲突。
- 会话不复制或丢失
- 应用 web.xml 缺少 、会话对象未实现 Serializable、或复制 Valve 未生效。
- 时间不同步导致会话过期判断异常,启用 NTP 同步时间。
- 单台机器运行多实例
- 必须修改 SHUTDOWN、HTTP、AJP、Receiver 端口,避免端口冲突;必要时为各实例设置不同的 jvmRoute(配合 AJP 粘性会话)。
- 高可用增强
- 在 Apache/Nginx/HAProxy 前增加 Keepalived 实现 VRRP 虚拟 IP,避免单点故障。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Tomcat在Ubuntu中如何进行集群配置
本文地址: https://pptw.com/jishu/759906.html
