Nginx 限制单 IP 并发连接数需使用 limit_conn 模块:先在 http 块用 limit_conn_zone $binary_remote_addr zone=perip:10m 定义共享内存区,再在 server 或 location 中用 limit_conn perip N 设置上限,并可选配 limit_conn_status、limit_conn_log_level 及 limit_rate 实现精细控制。

Nginx 本身不管理“线程”,它基于事件驱动模型(epoll/kqueue),使用单进程多路复用,没有传统意义上的“并发线程数”概念。你真正需要限制的,是并发连接数(connections)——即同一时刻保持活跃的 TCP 连接数量。这些连接可能对应客户端发起的请求(如 AJAX 轮询、长轮询、未关闭的 Keep-Alive 连接等),而每个连接在 Nginx 中由一个 worker 进程通过非阻塞 I/O 处理,并不等于一个 OS 线程。
所以,“限制访问资源的并发线程数”在 Nginx 场景下,实际应理解为:限制对特定资源(如某个接口路径、某个 IP 或整个服务)的并发连接上限。核心靠 ngx_http_limit_conn_module 模块实现,无需额外编译,默认启用。
限制单个 IP 的并发连接数
适用于防止单一客户端(如爬虫、恶意脚本)耗尽连接资源。
关键点:用 $binary_remote_addr 做 key,节省内存;zone 定义在 http 块。
http {
# 定义一个名为 perip 的共享内存区,10MB 存储 IP 连接计数
limit_conn_zone $binary_remote_addr zone=perip:10m;
}
server {
location /api/ {
# 同一 IP 对 /api/ 路径最多保持 5 个并发连接
limit_conn perip 5;
# 可选:返回 429 而非默认 503,便于前端识别限流
limit_conn_status 429;
# 可选:日志级别设为 warn,避免刷屏 error
limit_conn_log_level warn;
fastcgi_pass ...; # 或 proxy_pass,确保在转发前生效
}
}限制某类资源路径的全局并发连接数
比如 /download/ 或 /export/ 这类高开销操作,防止被大量并发请求拖垮后端。
http {
# 按请求 URI 前缀分组(注意:$request_uri 包含参数,$uri 不含)
limit_conn_zone $uri zone=dl_path:10m;
}
server {
location ^~ /download/ {
# 整个 /download/ 下所有请求共用 20 个并发连接配额
limit_conn dl_path 20;
# 配合 limit_rate 控制带宽,避免大文件压满网卡
limit_rate 512k;
}
}组合防护:IP + 全局双层限制
既防单 IP 暴力,也控整体负载,适合 ThinkPHP 后台、管理接口等敏感路径。
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
}
server {
location /admin/ {
# 单 IP 最多 3 连接
limit_conn perip 3;
# 整个 server 最多 100 连接(所有 location 总和)
limit_conn perserver 100;
}
}注意事项
-
limit_conn计数的是已建立、尚未关闭的 TCP 连接,不是请求数(limit_req才管请求频率)。 - Keep-Alive 连接会持续占用计数,直到超时或主动关闭;若客户端长期复用连接,实际并发数可能远低于请求数。
- zone 大小要合理:10MB 约支持 16 万个 IP(按
$binary_remote_addr计),业务量大时可调至 20m 或 32m。 - 必须确保
limit_conn指令写在fastcgi_pass/proxy_pass之前,否则无法拦截连接建立阶段。
本质上,Nginx 的并发控制是轻量、高效且面向连接的。只要明确你要保护的是“谁”(IP)、“哪里”(路径)、“多少”(数字),配置就非常直接。


















