Nginx limit_req模块不支持缓存,仅用于请求速率限制;“差异化缓存流量整形”是通过按合作伙伴IP分层限流(独立zone+map映射)并与proxy_cache协同,提升缓存命中率与响应质量。

nginx 的 limit_req 模块本身不支持缓存,也不直接参与缓存控制;它仅用于请求速率限制(即“流量整形”)。所谓“差异化缓存流量整形”,实际是将 按 IP(或合作伙伴标识)限流 与 缓存策略(如 proxy_cache)协同使用,从而在限流前提下保障高频合作方的缓存命中率和响应质量。关键在于:先精准识别合作伙伴,再分层限流,最后让缓存机制自然受益于更稳定的请求节奏。
1. 基于合作伙伴 IP 列表定义独立限流区域
不能共用一个 limit_req_zone,否则不同伙伴会相互影响。应为高优先级伙伴单独配置 zone,兼顾识别精度与内存开销:
- 用
$partner_id变量作为 zone key(推荐),而非原始$remote_addr,便于后续扩展(如支持 CIDR 或域名映射) - 在
http块中定义多个 zone,例如:
limit_req_zone $partner_id zone=partner_a:10m rate=100r/s;
limit_req_zone $partner_id zone=partner_b:10m rate=30r/s; - 通过
map指令将 IP 映射到 partner ID,支持单 IP、IP 段、甚至动态名单文件(配合include):
map $remote_addr $partner_id {
default "";
192.168.10.5 "partner_a";
192.168.20.0/24 "partner_b";
include /etc/nginx/partner_ips.conf;
}
2. 在 server 或 location 中按 partner 应用差异化限流策略
避免全局硬限流,而是根据 $partner_id 动态选择 zone,并设置合理突发容量(burst)与拒绝逻辑:
- 对核心伙伴(如 partner_a)启用宽松限流 + 允许突发:
limit_req zone=partner_a burst=200 nodelay; - 对普通伙伴(如 partner_b)启用严格限流 + 延迟排队:
limit_req zone=partner_b burst=30; - 未匹配 partner 的请求可走默认限流或放行(建议加兜底 zone,防止漏限):
limit_req zone=general_default burst=10;
3. 与 proxy_cache 协同提升缓存效率
限流本身不操作缓存,但稳定、低抖动的请求流能显著提升缓存命中率。需注意三点:
- 确保限流发生在
proxy_pass之前(即 location 内配置limit_req),避免被限流的请求仍触发后端查询 - 对已缓存响应,nginx 默认仍会执行限流检查——这是正确行为,保证限流粒度精确到每个请求
- 可结合
proxy_cache_lock on防止缓存失效时的并发回源,进一步降低后端压力,使限流效果更可持续
4. 监控与灰度验证必不可少
差异化限流上线前必须验证,否则容易误伤或失效:
- 开启
limit_req_log_level warn,在 error log 中记录被限流的$partner_id和状态码(503),便于定位问题 - 用
stub_status或 Prometheus + nginx-vts-exporter 暴露各 zone 的当前请求数、拒绝数,区分 partner 维度 - 灰度发布:先对单个 partner IP 开启限流,观察其平均响应时间、缓存命中率(
$upstream_cache_status)、错误率变化










