Nginx 的 limit_conn 用于按 key(如客户端 IP)限制并发连接数,工作在 TCP 连接建立阶段;需先用 limit_conn_zone 定义共享内存区,再在 server 或 location 中用 limit_conn 启用限制,超限返回 503。

在 Nginx 中,limit_conn 指令用于限制每个 key(比如客户端 IP)的并发连接数,常用来防爬、防刷或保护后端资源。它工作在连接建立阶段(即 TCP 连接),不涉及请求内容,因此轻量高效。
1. 定义连接限制区域(limit_conn_zone)
必须先用 limit_conn_zone 在 http 块中定义一个共享内存区域,用于存储连接状态:
语法:limit_conn_zone $variable zone=name:size;
常用示例(按 IP 限流):
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
}说明:
- $binary_remote_addr 是客户端 IP 的二进制表示(比 $remote_addr 更省内存);
- zone=perip:10m 表示创建名为 perip 的共享内存区,大小为 10MB,可存储约 16 万个 IP 的连接状态。
2. 在 server 或 location 中启用限制(limit_conn)
在 server 或 location 块中调用 limit_conn,指定使用哪个 zone 和最大并发数:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">location /api/ {
limit_conn perip 10; # 每个 IP 最多 10 个并发连接
proxy_pass http://backend;
}}
注意:
- limit_conn perip 10 表示每个 IP 地址在此 location 下最多维持 10 个**同时打开的连接**;
- 如果超过阈值,Nginx 返回 503 Service Temporarily Unavailable;
- 该限制对长连接(如 WebSocket、HTTP/2 流)同样生效。
3. 可选:配合 limit_rate 控制带宽
仅限连接数还不够?可以叠加 limit_rate 防止单连接占用过多带宽:
location /download/ {
limit_conn perip 3;
limit_rate 500k; # 每连接限速 500KB/s
}4. 注意事项与常见问题
- 多个
limit_conn指令在同一作用域会叠加生效(取最小值),但一般只配一个; - 如果用了反向代理(如 CDN 或负载均衡),
$binary_remote_addr可能是代理 IP,需改用$http_x_forwarded_for并确保可信; - 共享内存区(zone)必须在
http级定义,不能放在server或location内; - 连接数统计基于 socket 连接,不是请求数(例如一个 HTTP/2 连接可承载多个请求,但仍算作 1 个连接)。


















