可通过Nginx的limit_rate、limit_conn和limit_req指令组合实现CDN回源链路限速:limit_rate控制单连接响应速率,limit_conn限制并发回源连接数,limit_req基于令牌桶控制请求频率,并配合proxy_cache_use_stale和proxy_cache_lock降低真实回源压力。

可以通过 Nginx 的 limit_rate、limit_conn 和 limit_req 指令组合,在 CDN 回源链路中对单个连接或请求实施限速,避免源站被突发回源流量打垮。
在 proxy_pass 上游配置中启用 per-connection 限速
回源流量本质是 Nginx 作为客户端向源站发起的 HTTP 连接,可在 location 或 upstream 块中使用 proxy_buffering off 配合 limit_rate 控制每个回源连接的响应传输速率:
- 在
location块中添加:limit_rate 2m;(限制每个回源响应流速为 2MB/s) - 若需更精细控制,可结合
$sent_http_content_length或自定义变量做条件限速,例如对大文件(>10MB)才启用限速 - 注意该限速作用于 Nginx 向客户端转发数据时的出口带宽,但对回源请求本身不节流;真正约束回源行为需配合下游连接控制
用 limit_conn 限制并发回源连接数
防止大量缓存未命中导致瞬时建立过多回源连接,可在 upstream 或 location 中基于 key 限制连接数:
- 定义连接限制区域:
limit_conn_zone $binary_remote_addr zone=perip:10m; - 在回源 location 中启用:
limit_conn perip 10;(单个客户端最多 10 个并发回源连接) - 更合理的 key 是
$host$request_uri或$uri,用于防止单一热门资源引发雪崩,例如:limit_conn_zone $uri zone=hoturi:10m;+limit_conn hoturi 5;
用 limit_req 实现请求级速率控制与平滑突发
对高频回源请求(如小图、API 接口),可用令牌桶算法限制单位时间请求数,并允许可控突发:
- 定义请求限制区域:
limit_req_zone $binary_remote_addr zone=qps:10m rate=10r/s; - 应用到回源 location:
limit_req zone=qps burst=20 nodelay;(均值 10qps,最多突发 20 个请求立即处理) - 若希望严格匀速(不接受突发),去掉
nodelay,Nginx 将延迟排队请求;搭配limit_req_status 429可返回标准限流响应
配合 proxy_cache_use_stale 和 proxy_cache_lock 提升容错能力
限速只是防御手段,还需减少真实回源次数:
-
proxy_cache_use_stale updating error timeout http_500;:在缓存过期更新时,仍可返回旧缓存,避免多个请求同时穿透回源 -
proxy_cache_lock on;+proxy_cache_lock_timeout 5s;:确保同一 key 只有一个请求真正回源,其余等待或返回 stale 缓存 - 二者结合能显著降低回源并发压力,让限速策略更易生效且不影响用户体验
不复杂但容易忽略的是:所有限速指令必须放在实际执行 proxy_pass 的 location 块内,且优先级高于 rewrite 或 access 指令;测试时建议用 ab 或 wrk 模拟缓存未命中场景,观察源站负载和 Nginx 的 limit_req_rejected 计数器变化。

















