使用limit_conn按IP限制并发连接数可天然覆盖多标签场景,因浏览器复用TCP连接;应在关键路径如/api/v1/user/下配置,避免全局限制;阈值建议3–6,需结合真实客户端IP识别与429状态码优化。

直接用 limit_conn 按 IP 限制并发连接数,就能天然覆盖多浏览器标签场景——因为现代浏览器对同一域名默认启用 HTTP/1.1 keepalive 或 HTTP/2 多路复用,多个标签页通常共享少量 TCP 连接,limit_conn 正是统计这些活跃连接数,不是按请求或标签计数。
只在关键路径启用,避免误伤静态资源
多标签并发压力主要集中在登录、下载、API 等高能耗接口,不建议全局限制。否则 CSS/JS/图片等静态资源也会被限,反而增加 TCP 握手开销和 CPU 负担。
- 推荐写法:
location ^~ /api/v1/user/ { limit_conn perip 5; } - 避免写法:
location / { limit_conn perip 5; }(会限制所有路径) - 若需区分登录页和主页,可用精确匹配:
location = /login { limit_conn perip 3; }
合理设置连接数阈值:3–6 是常见平衡点
主流浏览器对同一域名默认最多建立 6 个 HTTP/1.1 连接;HTTP/2 下一个连接可承载多个 stream。设太低(如 1)会导致正常用户多标签卡顿;设太高(如 20)起不到防护作用。
- 普通业务接口:建议
limit_conn perip 5 - 大文件下载或 WebSocket:建议
limit_conn perip 3(抑制批量下载) - 登录/鉴权等安全路径:建议
limit_conn perip 2–3(防暴力探测)
确保识别的是真实客户端 IP
如果 Nginx 前有 CDN、WAF 或负载均衡器,$binary_remote_addr 默认拿到的是代理节点 IP,会导致所有用户被当成同一个 IP 限流(或完全失效)。
- 必须启用
http_realip_module - 在
http或server块中配置可信代理段:set_real_ip_from 10.0.0.0/8; - 指定头字段并开启递归解析:
real_ip_header X-Forwarded-For; real_ip_recursive on; - 之后 zone 可继续用
$binary_remote_addr(此时它已是还原后的真 IP)
增强可观测性与用户体验
默认返回 503 不利于前端区分原因,日志刷屏也影响问题定位。
- 改用语义更明确的状态码:
limit_conn_status 429; - 降低日志级别,只记录真正超限事件:
limit_conn_log_level error; - 可叠加限速,防止单连接持续占带宽:
limit_rate 512k;(放在同一 location 内)


















