<p>应将 limit_conn 精准作用于静态资源路径并使用独立 zone,如 location ^~ /static/ 或 location ~* .(js|css|png|jpg|woff2|zip|mp4)$ 内配置 limit_conn perip_static 5、limit_rate_after 10m、limit_rate 512k,并设 limit_conn_status 429 和 limit_conn_log_level warn。</p>

要限制单个 IP 对静态资源的并发下载连接,关键是把 limit_conn 精准作用于真实传输静态文件的请求路径,并用独立的共享内存区计数,避免影响 HTML、API 或前端路由。
只对匹配的静态资源路径启用限流
不能在 http 或 server 块顶层写 limit_conn,否则会误伤首页、接口等非下载类请求。必须锁定到实际提供静态文件的位置:
- 用前缀匹配目录:如
location ^~ /static/或location ^~ /assets/ - 用正则匹配后缀:如
location ~* \.(js|css|png|jpg|woff2|zip|mp4)$,注意末尾加$防止误配.zip.bak - 确保该
location不含try_files $uri $uri/ /index.html—— 否则所有前端 404 路由都会被当成静态资源计入连接数,导致白屏
定义专用连接状态区,不复用全局 zone
在 http{} 块开头单独建一个 zone,专用于静态资源下载控制:
-
limit_conn_zone $binary_remote_addr zone=perip_static:1m;—— 名称语义清晰,1MB 内存约支持 1.6 万个 IP 记录 - 用
$binary_remote_addr(非$remote_addr)更省内存,每个 IP 占约 64 字节 - 不要复用已有的
perip或conn_totalzone,防止不同策略互相干扰
在 location 中配置并发 + 限速组合策略
仅控连接数不够,还需防止单连接长期占用带宽。在匹配静态资源的 location 内同时配置:
-
limit_conn perip_static 5;—— 每个 IP 最多 5 个并发连接读取该路径下的资源 -
limit_rate_after 10m;—— 单连接下载满 10MB 后才开始限速(兼顾首屏加载和小文件体验) -
limit_rate 512k;—— 限速按连接生效,5 并发最高占用约 2.5MB/s,可控不抢业务带宽
增强可观测性与响应语义
让限流行为可查、可识别、易调试:
-
limit_conn_status 429;—— 返回标准429 Too Many Requests,比默认 503 更符合语义,前端可据此做退避重试 -
limit_conn_log_level warn;—— 触发限流时记为 warn 级别,便于从 error.log 快速定位异常 IP - 在
log_format中加入$limit和$limit_key,access log 可直接看到谁因哪个 zone 被限

















