Nginx 无 proxy_limit_rate 指令,限制反向代理出口带宽应使用 HTTP 核心模块的 limit_rate(单位字节/秒),配合 limit_rate_after 实现首段免限速;可通过 map 动态设置限速值,并与 limit_req 配合实现请求频次与带宽双重控制。

Nginx 本身没有 proxy_limit_rate 这个指令,这是常见的误解或拼写混淆。真正用于限制反向代理响应体传输速率的指令是 proxy_buffering 配合 limit_rate,或者更准确地说——limit_rate 指令作用于 upstream 返回的响应流,但它不是 proxy 模块专属,而是属于 HTTP 核心模块,在 location 或 server 块中生效。
要实现「限制反向代理下游客户端接收响应的速度」,关键在于理解:Nginx 作为反向代理时,它先从后端(upstream)拉取完整响应(或边收边转),再发给客户端;而限速发生在「Nginx → 客户端」这一段,与 proxy_pass 无直接语法绑定。
如何限制反向代理出口带宽
limit_rate 是最直接、轻量的方式,单位为字节/秒(支持 k/m 后缀),适用于控制单个连接的响应发送速率:
location /download/ {
proxy_pass http://backend;
limit_rate 500k; # 限制每个连接最大 500KB/s
limit_rate_after 1m; # 可选:前 1MB 不限速,之后开始限速
}-
limit_rate 500k:客户端下载响应时,Nginx 主动节流,每秒最多发出约 500KB 数据 -
limit_rate_after 1m:避免小文件(如图标、JS)被误限,提升首屏体验
该设置对所有匹配 location 的请求生效,无论是否用了 proxy_pass。
为什么不用 proxy_*_rate 类指令?
Nginx 官方 proxy 模块(ngx_http_proxy_module)不提供 proxy_limit_rate、proxy_send_rate 或类似指令。它有以下相关但用途不同的配置:
-
proxy_buffer_size/proxy_buffers:控制 Nginx 接收 upstream 响应时的内存缓冲行为 -
proxy_busy_buffers_size:限制同时发送给客户端的缓冲区大小 -
proxy_max_temp_file_size:响应过大时写临时文件的上限 -
proxy_buffering off:关闭缓冲,启用流式转发(此时limit_rate仍有效,但行为更实时)
⚠️ 注意:关闭 buffering 后,limit_rate 依然起作用,但限速点变为「Nginx 边收边发」过程中的输出节奏,而非缓存后统一发送。
更精细的带宽控制(按用户/IP/路径)
单纯 limit_rate 是连接级静态限速。若需动态策略(例如 VIP 不限速、普通用户限 2M,下载路径限 1M),可结合:
-
map指令做条件映射 -
limit_rate引用变量
示例:
map $http_x_user_role $user_rate {
default 1m;
"vip" 0; # 0 表示不限速
"~*test" 500k;
}
server {
location /media/ {
proxy_pass http://cdn_backend;
limit_rate $user_rate;
}
}这样就能根据请求头 X-User-Rule 动态分配出口带宽。
和限流(rate limiting)的区别
别把 limit_rate(带宽限速,单位:字节/秒)和 limit_req(请求频次限制,单位:请求/秒)混用:
-
limit_req防刷、防爆破,控制「多少次请求」 -
limit_rate防拖库、防大文件滥用,控制「多快发完」
两者可共存,互不干扰:
location /api/ {
limit_req zone=api burst=10 nodelay;
limit_rate 200k;
proxy_pass http://api_backend;
}既限制每秒最多 10 个 API 请求,又确保每个响应下发不超过 200KB/s。
不复杂但容易忽略


















