Nginx加权轮询不采集实时负载数据,监控重点是验证请求分发比例是否符合权重,并结合健康状态、延迟、失败率动态评估;可通过日志统计、OpenResty Lua动态校准或外部脚本比对告警实现。

在 Nginx 中,加权轮询(Weighted Round Robin)本身不提供实时负载率数据,Nginx 官方模块(如 upstream)只负责按权重分发请求,不采集后端真实响应时间、连接数或 CPU 使用率等指标。因此,“监控负载均衡率”实际是指:**监控各 upstream server 的实际请求分发比例是否符合预期权重,并结合后端健康状态、响应延迟、失败率等做动态评估**。
一、确认当前加权轮询的实际分发比例
利用 Nginx 内置的 stub_status 模块(需编译启用)或更推荐的 ngx_http_upstream_module 配合自定义日志,统计各 backend 接收的请求数:
- 在
upstream块中为每台服务器添加唯一标识(如server 192.168.1.10:8080 weight=3 id=backend-a;),注意id参数需 Nginx 1.19.5+ 支持; - 配置 access_log 使用
$upstream_addr和$upstream_response_time记录每次转发的目标与耗时; - 用脚本定时(如每分钟)解析日志:
awk '{print $NF}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
其中$NF可替换为$upstream_addr(需在 log_format 中显式定义);
二、用 Lua + OpenResty 实现运行时权重校准(推荐)
若已使用 OpenResty,可在 nginx.conf 中嵌入 Lua 脚本,动态调整 upstream 权重:
- 启用
lua_shared_dict存储各 backend 的近期成功率/平均延迟; - 在
access_by_lua_block中记录响应结果(成功/超时/5xx)并更新字典; - 通过
balancer_by_lua_block替换默认轮询逻辑,按实时质量(如:权重 × 成功率 ÷ 响应时间)重新计算调度概率; - 示例片段:
local balancer = require "ngx.balancer"
local ok, err = balancer.set_current_peer("192.168.1.11", 8080)
三、用外部脚本定期校验并告警(轻量级方案)
不依赖 OpenResty 时,可用 Bash/Python 脚本完成闭环监控:
- 读取 Nginx 配置中的
weight值(用grep -oP 'server\s+\S+\s+weight=\K\d+' nginx.conf); - 从 access_log 抽取最近 5 分钟数据,按
$upstream_addr统计请求数,计算实际占比; - 对比预期权重比(如 3:2:1 → 50% : 33.3% : 16.7%)与实际分布,偏差 >15% 则触发邮件或企业微信告警;
- 可选:调用
nginx -s reload临时剔除异常节点(需配合配置模板生成)。
四、补充建议:让监控更可靠
仅看请求分发比例不够,还需关注下游真实压力:
- 在后端服务暴露
/health接口,Nginxhealth_check指令自动摘除故障节点; - 用 Prometheus +
nginx-lua-prometheus采集nginx_upstream_requests_total等指标,Grafana 展示各 backend RPS/错误率/延迟 P95; - 避免“权重固定陷阱”:例如某节点硬件更强但权重设低,实际负载反而失衡——应结合压测结果反向校准权重。


















