应将 limit_conn 精准配置在静态资源 location 块中,使用专用 zone 如 perip_static,按 IP 限制并发连接数(如5个),配合 429 状态码与 warn 日志提升可观测性。

要限制静态目录(比如 /static/、/assets/)的总并发连接数,关键不是“按目录限流”,而是把 limit_conn 精准作用于只服务静态资源的 location 块,并搭配专用的共享内存区。它防的是慢下载、长连接占满资源,而不是压测式高频请求。
只在静态资源 location 中启用 limit_conn
不能写在 http 或 server 顶层,否则会误伤 API、HTML 页面或前端路由回退逻辑:
- 用
location ^~ /static/或location ~* \.(js|css|png|jpg|woff2)$精确匹配真实静态路径 - 确保该
location不含try_files @fallback或重写到index.html,否则 SPA 路由请求也会被计数 - 避免用
location /或模糊前缀(如location /s),防止非静态路径意外命中
定义专用的 per-path 连接状态区
在 http{} 块中单独声明 zone,不复用全站或其他路径的 zone:
limit_conn_zone $binary_remote_addr zone=perip_static:1m;-
1m内存约支持 1.6 万个独立 IP 的连接状态,轻量且隔离 - 不建议用
$server_name或$host作 key——它们无法区分路径,只适合站点级总量控制
配置生效并提升可观测性
在目标 location 内写入完整限流指令,并补充日志与状态码:
-
limit_conn perip_static 5;—— 表示每个 IP 最多 5 个并发连接正在读取该路径下的文件 -
limit_conn_status 429;—— 返回标准限流响应,便于前端识别和重试 -
limit_conn_log_level warn;—— 触发时记为 warn 级别,方便从 error.log 快速定位异常 IP
注意连接计数的真实边界
这个限制只统计“已建立、已读完请求头、尚未完成响应”的活跃 TCP 连接:
- 大文件下载、HTTP/1.1 keep-alive 空闲连接、长轮询都会被计入
- 快速 404(如请求不存在的图片)、未发完 header 就断开的连接,一般不计数
- 浏览器同时打开 5 个含
/static/资源的页面,第 6 个同域请求可能被直接拒绝










