proxy_download_rate 是 openresty/tengine 等增强版 nginx 支持的四层限速指令,仅在 stream 块中生效,控制上游→客户端的下行速率,单位为字节/秒(支持 k/m),不适用于官方 nginx 或 udp 场景。

直接用 proxy_download_rate 就能对 TCP 业务做带宽限速,但它只在 Nginx 的 stream 模块里生效,不是 HTTP 层的限速手段,也不依赖协议解析——适合 FTP、数据库、自定义 TCP 服务等纯四层场景。
必须满足的基础条件
缺一不可,否则配置不生效:
- Nginx 版本 ≥ 1.19.0(
stream模块基础支持) - 编译时启用了
--with-stream(静态)或加载了ngx_stream_module.so(动态) - 配置写在
stream { }块内,不能放在http { }或其他上下文中 - 只能用于 TCP 连接;UDP 不支持该指令
- 单位是字节/秒,支持
k(KiB)、m(MiB),比如500k= 512,000 字节/秒,不接受 kbps/Mbps 等比特单位
限速作用对象要搞清楚
proxy_download_rate 是从 Nginx 代理视角定义的“下载”:它限制的是 Nginx 向客户端发送数据的速率,即后端服务返回给 Nginx 的数据,再由 Nginx 推送给客户端这一段的带宽。
举例说明:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 你用 Nginx 代理 MySQL(端口 3306),后端 DB 返回查询结果给 Nginx,Nginx 再发给客户端 —— 此时
proxy_download_rate控制的就是这段转发速度 - 若代理的是远程文件传输服务(如私有 TCP 文件服务器),该指令就限制用户从该服务下载文件的最大速率
- 它 不控制 客户端上传到 Nginx 的速度(那是
proxy_upload_rate的职责)
实现用户级或 IP 级差异化限速
单靠固定数值不够灵活,可通过变量 + map 实现按需分配速率:
- 用
geo指令根据客户端 IP 划分群体(如白名单、VIP 用户、普通用户) - 用
map将群体映射为不同速率值(如 VIP →2m,普通 →200k) - 在
server块中引用该变量:proxy_download_rate $rate;
这样就能让不同用户走不同带宽通道,无需多个监听端口或复杂路由逻辑。
注意实际效果的边界情况
这个限速是字节级、滑动窗口式实现,基于系统时钟精度调度,不是硬件级硬限速:
- 存在微小抖动,短时可能略超设定值(例如设 10 字节/秒,但连续两小包在 100ms 内发出)
- 对极低速率(如
- 不适用于要求严格实时控速的金融报文或工业协议,更适合内容分发、数据库导出、批量文件下载等场景










