关键在于拉通nginx实例与后端集群数据比对,重点检查upstream分发一致性、配置参数统一性、dns解析一致性,通过vts模块聚合指标、日志分析客户端特征及健康检查闭环效果。

要监控分布式部署中各 Nginx 节点的负载均衡差异,关键不是只看单台 Nginx 的状态,而是把“Nginx 实例自身”和“它所代理的后端集群”两个层面的数据拉通比对。差异往往藏在转发行为是否一致、健康检查是否同步、日志分布是否对齐这些细节里。
看各 Nginx 实例的 upstream 分发一致性
多个 Nginx 节点如果配置完全相同,但实际流量分发不均,说明问题出在上游来源或本地策略。重点检查:
- 每台 Nginx 的 access_log 中 $upstream_addr 字段,用脚本按分钟统计各后端地址的请求数,再横向对比不同 Nginx 节点的日志结果。若某节点持续将 80% 请求打向 node-a,而其他节点均匀分配,就要查该节点是否被单独加了 ip_hash 或 location 级别的 proxy_pass 指向了固定 upstream
- 确认所有 Nginx 实例使用的 upstream 块名称、server 地址、weight、max_fails、fail_timeout 参数完全一致。哪怕端口多一个空格,vts 模块也会将其识别为不同 server,导致指标无法聚合
- 检查 DNS 解析是否一致:如果 upstream 使用域名(如 backend.service.local),需确认每台 Nginx 的 resolv.conf 和 resolver 配置一致,避免因本地缓存或不同 DNS 服务器返回不同 IP 导致实际后端不一致
用 vts 模块统一暴露并采集各节点指标
nginx-module-vts 支持跨实例聚合,前提是所有 Nginx 都启用且路径统一:
- 每台 Nginx 的 server 块中配置相同的 status 接口,例如 location /status { vhost_traffic_status_display; vhost_traffic_status_display_format json; }
- Prometheus 抓取时,用 relabel_configs 将 instance 标签标准化(如从 host IP 提取 region=sh、region=bj),再通过 nginx_vts_upstream_requests_total{upstream="backend"} 按 region + server 分组查询,一眼看出“上海节点的 Nginx 是否比北京节点多转发 3 倍请求到同一台后端”
- Grafana 中建面板,用 “TopN by region” 展示各区域 Nginx 对同一后端 server 的请求速率,异常偏高/偏低立刻标红
分析日志中的客户端特征与转发路径偏差
负载不均常源于客户端分布失衡,而非 Nginx 配置错误:
- 在 access_log 中加入 $remote_addr 和 $http_x_forwarded_for,统计各 Nginx 节点收到的客户端 IP 段分布。若华东节点 70% 请求来自 10.128.x.x(某云厂商 NAT 网关),而华北节点几乎没有,说明上层 DNS 或 Anycast 路由已造成入口流量倾斜,Nginx 层再均衡也无力回天
- 对比各节点日志中 $upstream_response_time 的 P95 值。若某节点所有后端响应都慢 200ms,但其他节点正常,可能是该 Nginx 所在网络存在跨机房延迟,或其所在宿主机 CPU/磁盘 IO 过载影响了 proxy 性能
- 用 map 指令为每个 Nginx 实例打唯一标识(如 map $host $nginx_node { default "unknown"; "nginx-sh-01" "sh-node-1"; }),写入日志后可直接关联分析“哪个节点开始出现 502 骤增”,快速定位故障域
验证健康检查是否全局生效
一台后端宕机,所有 Nginx 节点应同步剔除它。若只有部分节点还在转发,说明健康检查未真正闭环:
- 手动停掉一台后端服务,观察所有 Nginx 的 /status 页面中该 server 的 fails 计数是否都在上升、down 状态是否同时变为 1
- 检查各节点是否都配置了 health_check(需 stream 模块)或一致的 max_fails/fail_timeout;开源版无主动探测,被动检查依赖真实失败请求,若某节点流量极低,可能长期收不到失败响应,导致“僵尸节点”残留
- 在日志中筛选 $upstream_status ~ "50[2-4]" 的记录,按 Nginx 实例分组统计失败率。若某节点失败率是平均值的 5 倍,优先排查其网络连通性或 TLS 握手配置











