Nginx 的 weight 参数仅静态按比例分发请求,不感知物理机或虚拟机实际负载;应基于应用层指标(如 P95 延迟、可持续 QPS)动态设定权重,并配合健康检查与外部监控实现负载联动。
Nginx 的 weight 参数本身不感知物理机负载,也不读取虚拟机所在宿主机的 CPU、内存或 IO 使用率。它只做静态请求计数分发——也就是说,无论后端是物理机还是虚拟机,Nginx 都只按你写的 weight 值比例派发请求,完全不关心底层资源水位。
所以,“根据物理机负载配置权重”这个想法在 Nginx 原生机制里无法直接实现。但你可以通过合理设计,让权重间接反映真实承载能力,尤其当后端跑在虚拟机上时,需更谨慎处理。关键不是“抄物理机指标”,而是用可测、可观、可复现的应用层指标来反推虚拟机的实际服务能力。
虚拟机的性能受多种因素影响:宿主机资源争抢(CPU steal time、内存 balloon)、磁盘 IO 共享、网络带宽隔离、甚至 hypervisor 调度策略。单纯看宿主机 top 里的 CPU 80%,不能说明这台 VM 就该降权——它可能只是被隔壁 VM 抢占了时间片,而自身应用仍很轻快。
正确做法是:
/api/health 或核心查询路径)发起标准化压测举例:VM-A(P95=100ms)→ weight=1;VM-B(P95=180ms)→ weight≈0.56 → 取整为 1;VM-C(P95=75ms)→ weight≈1.33 → 取整为 1。三台都设 weight=1,说明它们当前实际响应能力接近,强行配成 3:1:2 反而失衡。
如果某台宿主机整体过载(如 CPU steal > 15%、iowait > 30%),其上的所有 VM 都可能变慢。这时:
max_fails=3 fail_timeout=30s)proxy_next_upstream error timeout http_503,让失败请求自动 fallbackdown 标记,或通过 Lua 动态修改 weight(需 openresty)backup 标记备用 VM,而不是设 weight=0keepalive 32,proxy 区域配 proxy_http_version 1.1 和 proxy_set_header Connection '',减少 VM 上频繁建连带来的额外开销如果你确实需要根据宿主机负载动态调权,可行路径是:
down)并 reload不复杂但容易忽略。