最有效且低开销的静态资源并发限制方案是直接在location块中用limit_conn配合limit_conn_zone:1. 在http{}中定义zone:limit_conn_zone $binary_remote_addr zone=perip_static:10m;2. 在静态资源location中启用limit_conn perip_static 8;3. 配合keepalive_timeout、limit_conn_log_level warn和limit_conn_status 429增强实效;4. 注意cdn场景改用$http_x_forwarded_for、避免server顶层误配、区分静态与上传zone。

直接在 location 块中用 limit_conn 限制单个 IP 对静态资源路径的并发连接数,是最有效且低开销的加固手段——它不依赖请求体解析或后端响应,只在 TCP 连接建立、请求头读完时计数,能第一时间拦住恶意扫描、爬虫批量下载或慢连接耗尽资源的行为。
1. 定义 per-IP 连接状态区(必须在 http{} 中)
这一行是前提,不能放在 server 或 location 里:
limit_conn_zone $binary_remote_addr zone=perip_static:10m;
其中:
$binary_remote_addr 比 $remote_addr 更省内存(固定 4 字节),适合高并发;
perip_static 是自定义 zone 名,后续 limit_conn 会引用它;
10m 表示分配 10MB 共享内存,足够记录约 32 万个不同 IP 的连接状态(按 32 位平台估算)。
2. 在静态资源 location 中启用限制
把限制精准落在 .js、.css、.png 等实际静态路径上,避免影响 API 或动态接口:
location ~* \.(js|css|png|jpg|gif|ico|woff2?|ttf|eot|svg)$ {limit_conn perip_static 8;# 其他静态配置:expires, add_header, try_files 等}
这里设为 8 是常见合理值:普通浏览器加载一个 HTML 页面通常发起 6–10 个静态资源请求,HTTP/2 复用连接后实际并发 TCP 连接远少于请求数;设太高起不到防护作用,设太低(如 2)易误伤正常用户。
3. 配合 keepalive 和日志增强实效性
仅靠 limit_conn 不够,需补充两点关键配置:
-
keepalive_timeout 15;—— 防止空闲长连接长期占着配额,15 秒较平衡体验与资源释放 -
limit_conn_log_level warn;—— 把触发限流的日志提至 warn 级,方便从 access/error 日志中快速识别异常 IP -
limit_conn_status 429;—— 返回 429 Too Many Requests 而非默认 503,语义更准确,前端可据此做退避重试
4. 注意事项与避坑点
这些细节常被忽略,却直接影响效果:
- 限制只对“已读完请求头”的连接生效,SYN Flood 类攻击需靠系统层(如 iptables 或云 WAF)防御
- 如果用了 CDN 或反向代理(如 Nginx 前还有 SLB),
$binary_remote_addr取到的是代理 IP,应改用$http_x_forwarded_for并确保可信来源(配合set_real_ip_from) - 不要在
server块顶层直接写limit_conn perip_static N,否则会把 favicon.ico、健康检查等所有请求都计入,导致误限 - 若站点同时提供静态资源和上传接口,建议用不同 zone 名(如
perip_static和perip_upload),避免上传大文件长时间占用静态连接槽位











