前言
本文详细记录基于 Keepalived+Nginx+Tomcat+MySQL 的高可用架构搭建过程中的排查过程与解决方案。
一、项目架构回顾
- 两台 Nginx+Keepalived 节点:master(192.168.211.134)、backup(192.168.211.135),共享 VIP 192.168.211.100。
- 两台 Tomcat 节点:tomcat1(192.168.211.128)、tomcat2(192.168.211.133),部署了同一个 JSP 应用(testdb.jsp),连接 MySQL 数据库。
- MySQL 服务器:192.168.211.136。
目标:用户通过 VIP 访问,Nginx 反向代理到 Tomcat 集群,Keepalived 保证 Nginx 高可用,Tomcat 通过 JDBC 连接 MySQL。
二、问题一:VIP 同时出现在 master 和 backup
现象
在 master 上执行 ip addr show 看到 VIP 绑定正常,但 backup 上也出现了同样的 VIP,导致 IP 冲突,网络混乱。
# backup 节点
[root@backup ~]# ip addr show | grep 192.168.211.100
inet 192.168.211.100/32 scope global ens160
排查过程
- 检查 Keepalived 状态 两台节点的 keepalived 都在运行,但 backup 不应该持有 VIP。
- 查看 Keepalived 日志
发现 backup 持续收到自己的 VRRP 广播,说明 master 的广播未到达。journalctl -u keepalived -xe - 网络连通性 互相 ping 通,但 VRRP 使用组播地址 224.0.0.18,需要确认防火墙是否放行。
- 防火墙拦截 VRRP 检查防火墙规则,发现未放行 VRRP 协议(协议号 112)。
解决
临时关闭防火墙测试(确认问题):
systemctl stop firewalld
重启 keepalived 后,VIP 只出现在 master 上。 永久解决:放行 VRRP 协议并重新开启防火墙。
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
systemctl start firewalld
三、问题二:访问 VIP 的 80 端口看到 Nginx 默认页
现象
通过浏览器访问 http://192.168.211.100,显示的是 Nginx 欢迎页,而不是 Tomcat 的应用页面。
排查
- 检查 Nginx 配置 Nginx 默认的/etc/nginx/nginx.conf 只配置了静态文件服务,没有反向代理。需要添加 upstream 和 location。
- 添加代理配置
在/etc/nginx/conf.d/下创建 tomcat.conf:
测试配置并重载:upstream web { server 192.168.211.128:8080; server 192.168.211.133:8080; } server { listen 80; server_name 192.168.211.100; location / { proxy_pass http://web; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

