Nginx 的 limit_conn 模块通过共享内存区限制单 IP 并发连接数,需先在 http 块用 limit_conn_zone 定义 zone,再在 server 或 location 中用 limit_conn 引用并设上限,可配合 limit_rate 实现带宽控制,并通过 503 状态码和错误日志验证效果。

Nginx 的 limit_conn 模块可以限制每个客户端 IP 的并发连接数,防止资源被单个用户过度占用。关键在于正确配置共享内存区域、定义连接限制规则,并在 server 或 location 块中启用。
准备 shared memory zone(共享内存区)
必须先用 limit_conn_zone 指令定义一个用于统计连接数的共享内存区域,它会把客户端 IP 作为 key 存入内存,供多个 worker 进程共用。
在 http 块中添加:
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
说明:
-
$binary_remote_addr是客户端真实 IP 的二进制格式,比$remote_addr更节省内存; -
zone=conn_per_ip:10m表示创建名为conn_per_ip的共享内存区,大小为 10MB(通常 1MB 可存储约 1.6 万个 IP 记录); - 该指令只能出现在
http级别,不能写在 server 或 location 中。
在 server 或 location 中启用连接限制
使用 limit_conn 指令引用上面定义的 zone,并设定最大并发连接数。
例如,在 server 块中限制每个 IP 最多 10 个并发连接:
server {
listen 80;
server_name example.com;
limit_conn conn_per_ip 10;
...
}
也可以放在某个特定 location 下,比如只对 API 接口限流:
location /api/ {
limit_conn conn_per_ip 5;
}
注意:limit_conn 对 TCP 连接计数(包括 keepalive 连接),不是请求数;如果启用了 HTTP/2,一个连接可承载多个请求,效果会更强。
配合 limit_rate 实现更精细控制
单独限连接数可能不够,建议搭配 limit_rate 防止大流量拖慢服务。
例如:限制每个 IP 并发不超过 10,且每连接带宽不超 100KB/s:
limit_conn conn_per_ip 10; limit_rate 100k;
还可以用 limit_rate_after 允许初始快速下载(如前 5MB 不限速,之后限速):
limit_rate_after 5m; limit_rate 50k;
验证与调试技巧
配置完成后 reload Nginx,可通过以下方式确认是否生效:
- 用
ab或wrk工具模拟多个并发连接(同一 IP),观察返回状态码:超出限制时通常返回 503 Service Temporarily Unavailable; - 开启 Nginx 错误日志(
error_log /path/error.log notice;),设置级别为notice或更高,可看到类似 "limiting connections by zone \"conn_per_ip\"" 的日志; - 检查
stub_status模块输出(需编译时启用),其中Active connections显示当前总连接数,结合日志判断是否触发了限制。










