nginx无法直接运行时降速,需通过脚本动态修改upstream中后端weight值并重载配置实现等价效果;支持按业务时段或监控指标(错误率、cpu)自动调整权重,不中断服务。

不能直接“降速”,Nginx 本身不提供运行时动态调整 weight 的接口,但可通过脚本化方式实现效果等价的自动权重下调——本质是按需生成新配置 + 安全重载。
核心逻辑:用时间或指标触发配置重写
所谓“降速”,实际是降低某台后端在 upstream 中的 weight 值(比如从 10 降到 2),甚至设为 0(暂停流量但保留健康检查)。这必须通过外部脚本完成三件事:
- 读取当前业务状态(如小时、CPU 使用率、错误率、自定义标记文件)
- 根据规则生成带新权重的
upstream.conf文件 - 执行
nginx -t && nginx -s reload生效,不中断服务
按业务时段自动降权(最常用)
适合早晚高峰后、夜间低负载期主动降低主力节点权重,把流量导向备用机或休眠节点。示例脚本逻辑:
- 22:00–06:00:主服务器 weight=1,备用服务器 weight=5
- 06:00–22:00:主服务器 weight=8,备用服务器 weight=2
- 脚本每 15 分钟检查一次
date +%H,匹配时段后覆盖/etc/nginx/conf.d/upstream.conf
按监控指标触发降权(进阶)
当后端出现异常时自动“减速”。需配合外部采集(如 Prometheus + node_exporter 或自定义脚本):
- 若某台后端 5 分钟错误率 > 5%,脚本将其
weight改为 1,并加注释# auto-degraded due to error_rate>5% - 若其 CPU 持续 > 90% 超过 3 分钟,
weight设为 0(不参与轮询,但仍接受健康检查) - 恢复条件可另设:连续 5 分钟错误率
安全重载的关键细节
脚本中必须包含防御性操作,否则一次写错就导致整个代理中断:
- 每次生成新配置前,先备份旧文件:
cp upstream.conf upstream.conf.bak.$(date +%s) - 用
nginx -t验证语法,仅当输出successful才执行 reload - 权重值只允许正整数或 0;禁止小数、负数、空格或变量未定义(如
$WEIGHT为空时写成weight=会报错) - 建议在 reload 后加简短日志:
echo "$(date): weight updated, reloaded" >> /var/log/nginx/weight-switch.log











