nginx需按路径对静态资源和动态接口实施差异化限流:静态资源用宽松速率(如100r/s)和较大burst(50–200),动态接口用严格速率(如5r/s)和小burst(≤10),并分别配置独立zone、叠加连接数与用户级限流,内存分配需匹配业务特征。

静态资源(如 CSS、JS、图片)和动态接口(如 /api/、/order)在访问行为、资源消耗和业务敏感性上差异很大,不能共用一套限流规则。Nginx 支持按 location 精确区分路径,并结合不同 zone 和参数实现差异化防护。
按路径定义独立限流区域
核心是为静态资源和动态接口分别声明互不干扰的 limit_req_zone,避免状态混用:
- 对静态资源(如
/static/、/*.js、/*.png)用宽松速率,例如rate=100r/s,因它们通常由 CDN 或本地缓存服务,Nginx 处理开销极小; - 对动态接口(如
/api/、/user/)用严格速率,例如rate=5r/s,因其需后端计算、查库、加锁,单请求成本高; - 可复用
$binary_remote_addr作为键,但必须使用不同 zone 名称,例如zone=static_limit:10m和zone=api_limit:10m。
动静分离路径配置示例
在 server 块中按 location 匹配并启用对应限流:
- 静态资源路径(推荐用前缀或扩展名匹配):
location ~* \.(js|css|png|jpg|gif|ico|svg)$ {<br> limit_req zone=static_limit burst=100 nodelay;<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br>} - API 接口路径:
location ^~ /api/ {<br> limit_req zone=api_limit burst=10 nodelay;<br> proxy_pass http://backend;<br>} - 关键操作路径(如下单、秒杀)可再单独强化:
location = /api/order/submit {<br> limit_req zone=submit_limit burst=2 nodelay;<br> proxy_pass http://backend;<br>}
结合连接数与用户级限流提升精度
仅靠 IP 限流不够精细,建议叠加维度:
- 对静态资源一般无需
limit_conn,但可加limit_rate 1m;防止单个大文件下载占满带宽; - 对动态接口,除
limit_req外,建议补充limit_conn perip 20;控制单 IP 并发连接数,防慢速攻击; - 若后端已透传用户标识(如
X-User-ID),可用limit_req_zone $http_x_user_id zone=user_api:10m rate=3r/s;实现更公平的用户级限流,避免一人多号绕过 IP 限制。
注意内存分配与突发参数匹配业务特征
不同 zone 的内存大小和 burst 值需按实际压测调整:
- 静态资源 zone 可设较小内存(如
5m),因访问 IP 分散、长尾明显; - API zone 建议至少
20m,支撑百万级 UV 下的 IP 状态存储; -
burst不是越大越好:静态资源 burst 可设 50–200(适配浏览器并发加载),API 接口 burst 建议 ≤10(防止队列积压拖垮后端); - 含
nodelay时,burst 内请求立即处理,务必确保后端能扛住这波瞬时压力。











