应避免静态资源被全局限流规则覆盖,仅在api等关键路径配置limit_conn;静态资源location不写该指令即可豁免,或用独立zone(如static_perip 50)实现宽松限流,同时配合keepalive_timeout和limit_rate优化体验。

静态资源(如图片、CSS、JS)通常体积小、响应快,但并发量高,若和 API 或下载接口共用同一套限流规则,容易因连接数被占满而拖慢整体访问体验。想针对性放宽静态资源目录的并发限制,关键不是“单独提高”,而是**避免它被更严格的规则覆盖**,同时确保它不干扰核心业务路径的防护。
只在需要限流的 location 中配置 limit_conn
limit_conn 的作用域遵循“嵌套层级中最内层最小值”原则。如果整个 server 块写了 limit_conn perip 5,那所有子 location 都会继承这个 5 连接上限——包括 /static/ 目录,这就太紧了。
正确做法是:把 limit_conn 只加在真正需要严控的路径里,比如:
location /api/ { limit_conn perip 3; }location /download/ { limit_conn perip 2; }location /ws/ { limit_conn perip 1; }
而静态资源目录(如 location ~ \.(js|css|png|jpg|gif)$ 或 location ^~ /static/)里**不写任何 limit_conn 指令**。这样它就完全不受 per-IP 并发限制,实际并发数只受系统级 worker_connections 和操作系统文件描述符限制,足够应对常规静态资源请求。
为静态资源设置独立、宽松的 zone(可选进阶)
如果站点存在大量爬虫盯静态资源,又不想影响 API,可以反向操作:给静态资源定义一个专门的、宽松的限流 zone。
- 在 http 块中新增:
limit_conn_zone $binary_remote_addr zone=static_perip:10m; - 在静态 location 中启用:
limit_conn static_perip 50;
这个 50 是针对静态资源的独立上限,和 API 的 perip 3 完全不冲突——因为它们用的是不同 zone 名,互不影响。这种方式适合有明确区分策略、且需对静态资源也做基础兜底的场景。
配合 keepalive_timeout 和 limit_rate 更合理
静态资源走 HTTP/1.1 长连接很常见,一个连接能复用多次请求。若不限制空闲时长,连接会长期占用配额。
- 在 server 或 http 块中设:
keepalive_timeout 15;,及时释放不用的连接 - 对大图等资源可叠加限速:
limit_rate 512k;,防止单个连接持续吞带宽,但不卡连接数
这样既保障了静态资源的高并发能力,又避免了资源被单个连接长期霸占。
注意代理环境下的真实 IP 还原
如果前端有 CDN 或负载均衡,$binary_remote_addr 默认是代理 IP,会导致所有用户被算作同一个地址,静态资源限流失效或误伤。
- 确认已启用
http_realip_module - 配置可信代理段:
set_real_ip_from 10.0.0.0/8;(按实际填) - 指定头字段:
real_ip_header X-Forwarded-For;,并开启递归:real_ip_recursive on; - 静态资源 location 中如需限流,key 改用
$realip_remote_addr更稳妥











