nginx 无法原生支持定时任务,但可通过外部 cron 修改独立限流配置文件并热重载实现自动调速;需抽离 limit_params.conf、编写 adjust_rate.sh 脚本、配置 crontab,并推荐 openresty+redis 等免 reload 方案。

Nginx 本身不支持原生定时任务机制,无法像脚本那样直接“每小时自动改 rate 值”。但可以通过外部控制 + 热重载方式,实现高峰期自动调高限流阈值、低峰期自动调低的效果。核心思路是:把限流参数抽离为独立配置文件,用定时任务(如 cron)修改该文件并触发 nginx -s reload。
1. 抽离限流配置到独立文件
避免硬编码在主配置中,便于程序化更新:
/etc/nginx/conf.d/limit_params.conf
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;<br>limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
然后在 http 块中引入:
http {<br> include /etc/nginx/conf.d/limit_params.conf;<br> # 其他配置...<br>}
2. 编写切换阈值的 Shell 脚本
例如保存为 /usr/local/bin/adjust_rate.sh:
- 用 sed 替换 rate 值,支持传参(如
./adjust_rate.sh 50r/s) - 检查语法:
nginx -t,失败则退出不重载 - 成功后执行:
nginx -s reload - 可记录操作日志,便于审计
3. 配置 cron 定时任务
编辑 crontab -e,按业务节奏设置:
- 每天早 9 点设为高峰阈值:
0 9 * * * /usr/local/bin/adjust_rate.sh 100r/s - 晚 10 点切回基础值:
0 22 * * * /usr/local/bin/adjust_rate.sh 20r/s - 秒杀前 10 分钟临时提额(可配合脚本加时间判断)
4. 更健壮的替代方案(推荐生产环境)
纯 cron 有延迟和单点风险,进阶做法包括:
- 用 OpenResty + Lua + Redis 实现运行时动态读取阈值,无需 reload
- 接入 Consul 或 etcd,Nginx Plus 可监听 KV 变更自动更新 limit_req_zone
- 通过 Prometheus 告警触发 webhook,调用自动化脚本升降配
这些方式避免了 reload 带来的短暂连接中断,也更适合微服务与弹性扩缩场景。











