最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 中故障排查如何通过错误日志排查主备高可用切换时的异常
时间:2026-08-28 20:20:49 编辑:袖梨 来源:一聚教程网
Nginx在主备切换中不参与决策,但因状态错位、配置不一致或依赖异常而报错;需结合error.log时间戳、Keepalived日志及系统日志交叉验证,重点排查端口冲突、上游连接拒绝、配置文件缺失三类典型错误。
主备高可用切换时 Nginx 本身不直接参与“主备切换逻辑”(那是 Keepalived、HAProxy 或自研控制器的事),但作为被调度的服务,它常因切换过程中的状态错位、配置不一致或依赖异常而报错。错误日志是定位这类问题的第一手证据——关键不是“有没有报错”,而是“在什么时机、由谁触发、伴随什么上下文”。
确认 Nginx 是否真被卷入了切换事件
很多所谓“切换异常”其实是误判:Nginx 进程根本没重启,只是 VIP(虚拟 IP)漂移导致客户端连不上。先验证:
- 检查 error.log 时间戳是否与切换时间吻合(例如 Keepalived 发生 MASTER→BACKUP 切换的时刻)
- 用
journalctl -u keepalived -n 30 --since "2026-08-20 14:00:00"对齐时间轴,看是否有Transition to MASTER STATE或VRRP_Instance(vi_1) Entering FAULT STATE - 如果 Nginx 日志在切换前后无新增,说明它未被 reload 或重启,问题大概率出在网络层或客户端 DNS 缓存
重点筛查三类典型 error_log 线索
主备切换期间,Nginx 错误日志中高频出现且具诊断价值的报错有:
-
bind() to 0.0.0.0:80 failed (98: Address already in use):VIP 漂移后,原 BACKUP 节点上的 Nginx 未及时停止,新 MASTER 节点尝试启动时端口冲突。需检查 Keepalived 的 notify_script 是否正确执行了
nginx -s stop - connect() failed (111: Connection refused) while connecting to upstream:切换后 Nginx 仍尝试连接已下线的旧上游(如老 Master 数据库),说明 upstream 配置未随角色动态更新,或 health_check 未生效
-
open() "/etc/nginx/conf.d/active.conf" failed (2: No such file or directory):脚本化切换(如通过 Ansible 或 shell)未同步配置文件,或文件权限/SELinux 上下文未继承,用
namei -l /etc/nginx/conf.d/active.conf验证路径可达性
比对主备节点 error_log 差异
同一时刻,主节点和备节点的日志内容应高度一致(除角色相关字段)。若发现差异,说明状态未收敛:
- 主节点 error.log 里有大量
[warn] 12345#67890: *1 upstream server temporarily disabled,而备节点没有 → 主节点 upstream 健康检查失败,但备节点未同步禁用该 server,可能造成脑裂流量 - 备节点 error.log 出现
[emerg] unknown directive "keepalive_requests"→ 两节点 Nginx 版本不一致(该指令 1.15.3+ 才支持),版本混用易引发 reload 失败 - 主节点日志含
SSL_do_handshake() failed (SSL: ... certificate verify failed),备节点无 → SSL 证书未同步部署到备机,或证书链文件路径硬编码未适配
配合系统日志交叉验证切换动作
单看 Nginx error.log 容易断章取义,必须联动底层日志还原完整链路:
- 查 Keepalived 日志:
journalctl -u keepalived --since "5 minutes ago",确认是否完成Entering MASTER STATE并执行了 notify script - 查 Nginx reload 行为:
journalctl -u nginx --since "5 minutes ago" | grep -E "(reloading|reload|start)",看是否收到 SIGHUP 或执行了nginx -s reload - 查内核拦截:
ausearch -m avc -ts recent | grep nginx(RHEL/CentOS),防止 SELinux 在切换后拒绝新上下文下的日志写入或配置读取