应将 limit_conn 置于精准匹配静态路径的 location 块内,如 location ^~ /static/,配合专用 limit_conn_zone $binary_remote_addr zone=perip_static:1m; 并设 limit_conn perip_static 5;,避免全局或复用 zone,仅限制真实传输中的并发连接,辅以 429 状态码和 warn 日志提升可观测性。

要限制单个静态路径(比如 /static/ 或 /assets/)的并发连接数,核心是把 limit_conn 放在对应 location 块里,并配合精准定义的共享内存区域。它不是限制“每秒多少请求”,而是控制“同一时刻有多少 TCP 连接正在读取该路径下的资源”,这对防慢连接攻击、保障关键静态资源稳定供给很有效。
只对特定静态路径启用限制
不能把 limit_conn 写在 http 或 server 顶层——那样会全局生效,影响 API、首页回退等其他逻辑。必须锁定到目标路径:
- 用
location ^~ /static/或location ~* \.(js|css|png|jpg|woff2)$精确匹配静态资源位置 - 在该
location内写limit_conn perip_static 5;(注意 zone 名需与前面定义一致) - 确保该 location 不含
try_files回退到index.html,否则前端路由误命中也会被统计
单独定义路径专用的连接状态区
避免和全站或其他路径共用 zone,防止互相干扰:
- 在
http块中新增一行:limit_conn_zone $binary_remote_addr zone=perip_static:1m; -
1m足够存约 1.6 万个 IP 的连接状态,比通用 zone 更轻量 - 不建议复用已有的
peripzone,否则限制会叠加作用到所有用了它的 location
注意连接计数的实际含义
这个限制只对“真实发起并正在传输静态文件”的连接生效:
- 大文件下载、长时间未关闭的 keep-alive 连接会被计入
- 快速 404 的请求(如请求不存在的图片)、未发完 header 就断开的连接,一般不计数
- 如果用户用浏览器同时打开 5 个含该路径资源的页面,可能刚好卡在第 6 个请求上,返回 503
搭配简单响应优化体验
让限流更友好、更易排查:
- 加
limit_conn_status 429;返回标准限流状态码,方便前端做重试或提示 - 加
limit_conn_log_level warn;把触发限流的 IP 记为 warn 级别,便于从日志快速定位异常行为 - 不建议在此 location 同时配
limit_req,二者逻辑不同,容易混淆策略意图

















