Nginx 中故障排查如何通过错误日志排查主备高可用切换时的异常

作者:袖梨 2026-08-28

Nginx在主备切换中不参与决策,但因状态错位、配置不一致或依赖异常而报错;需结合error.log时间戳、Keepalived日志及系统日志交叉验证,重点排查端口冲突、上游连接拒绝、配置文件缺失三类典型错误。

主备高可用切换时 Nginx 本身不直接参与“主备切换逻辑”(那是 Keepalived、HAProxy 或自研控制器的事),但作为被调度的服务,它常因切换过程中的状态错位、配置不一致或依赖异常而报错。错误日志是定位这类问题的第一手证据——关键不是“有没有报错”,而是“在什么时机、由谁触发、伴随什么上下文”。

确认 Nginx 是否真被卷入了切换事件

很多所谓“切换异常”其实是误判:Nginx 进程根本没重启,只是 VIP(虚拟 IP)漂移导致客户端连不上。先验证:

  1. 检查 error.log 时间戳是否与切换时间吻合(例如 Keepalived 发生 MASTER→BACKUP 切换的时刻)
  2. journalctl -u keepalived -n 30 --since "2026-08-20 14:00:00" 对齐时间轴,看是否有 Transition to MASTER STATEVRRP_Instance(vi_1) Entering FAULT STATE
  3. 如果 Nginx 日志在切换前后无新增,说明它未被 reload 或重启,问题大概率出在网络层或客户端 DNS 缓存

重点筛查三类典型 error_log 线索

主备切换期间,Nginx 错误日志中高频出现且具诊断价值的报错有:

  1. bind() to 0.0.0.0:80 failed (98: Address already in use):VIP 漂移后,原 BACKUP 节点上的 Nginx 未及时停止,新 MASTER 节点尝试启动时端口冲突。需检查 Keepalived 的 notify_script 是否正确执行了 nginx -s stop
  2. connect() failed (111: Connection refused) while connecting to upstream:切换后 Nginx 仍尝试连接已下线的旧上游(如老 Master 数据库),说明 upstream 配置未随角色动态更新,或 health_check 未生效
  3. 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 差异

同一时刻,主节点和备节点的日志内容应高度一致(除角色相关字段)。若发现差异,说明状态未收敛:

  1. 主节点 error.log 里有大量 [warn] 12345#67890: *1 upstream server temporarily disabled,而备节点没有 → 主节点 upstream 健康检查失败,但备节点未同步禁用该 server,可能造成脑裂流量
  2. 备节点 error.log 出现 [emerg] unknown directive "keepalive_requests" → 两节点 Nginx 版本不一致(该指令 1.15.3+ 才支持),版本混用易引发 reload 失败
  3. 主节点日志含 SSL_do_handshake() failed (SSL: ... certificate verify failed),备节点无 → SSL 证书未同步部署到备机,或证书链文件路径硬编码未适配

配合系统日志交叉验证切换动作

单看 Nginx error.log 容易断章取义,必须联动底层日志还原完整链路:

  1. 查 Keepalived 日志:journalctl -u keepalived --since "5 minutes ago",确认是否完成 Entering MASTER STATE 并执行了 notify script
  2. 查 Nginx reload 行为:journalctl -u nginx --since "5 minutes ago" | grep -E "(reloading|reload|start)",看是否收到 SIGHUP 或执行了 nginx -s reload
  3. 查内核拦截:ausearch -m avc -ts recent | grep nginx(RHEL/CentOS),防止 SELinux 在切换后拒绝新上下文下的日志写入或配置读取

相关文章

精彩推荐