Nginx轮询本身不限制单节点并发连接数,需配合max_conns(限制空闲长连接上限)与keepalive使用;启用least_conn可优先分发至活跃连接更少的后端;per-IP限流需结合一致性哈希与后端控制;同时须用limit_conn限制客户端到Nginx的并发连接。

Nginx 的轮询(round-robin)本身不提供单节点并发连接数的硬性上限,但可以通过 max_conns 配合 keepalive 实现有效控制。关键在于:轮询只负责分发请求,真正限制“打到某台后端的并发连接数”,靠的是 upstream 层对每个 server 的连接池管理。
用 max_conns 限制每个后端节点的空闲连接上限
这是最直接、原生支持的方式。它不是限制“正在处理的请求数”,而是限制 Nginx 与该后端之间可维持的**最大空闲长连接数**——对 HTTP/1.x 后端来说,这个值通常就等效于并发处理能力上限。
-
max_conns必须写在upstream块中每个server行后面,例如:server 192.168.1.10:8080 max_conns=25; - 必须搭配
keepalive N;使用,否则连接无法复用,max_conns几乎无效 - 超出
max_conns后的行为取决于是否启用queue指令:未启用则直接返回 502 或排队等待;启用后可设超时时间
避免轮询导致连接集中,用 least_conn 辅助负载均衡
默认轮询不看后端负载,容易把多个请求连续打到同一台已满负荷的机器上。改用 least_conn 可让新请求优先落到当前活跃连接数更少的节点,天然缓解单点压力。
- 配置方式:在
upstream块开头加上least_conn; - 它和
max_conns是协同关系:前者降低“被选中概率”,后者兜底“选中后也不能超限” - 注意:
least_conn统计的是 Nginx 当前发往该后端的**活跃连接数**(即正在传输中的请求),不是后端自身处理中的请求数
配合后端做 per-IP 精准限流(推荐组合方案)
如果目标是“同一个客户端 IP 最多只让 1 个请求到达某台后端”,仅靠 Nginx 轮询 + max_conns 无法做到——因为轮询不绑定 IP。这时需要引入一致性哈希,并把最终限流交给后端。
- 在 upstream 中使用
hash $binary_remote_addr consistent;,让相同 IP 固定路由到同一台后端 - 后端服务自行实现 per-IP 并发控制,比如 Spring Boot 配置
server.tomcat.max-connections或 Go 的http.Server.MaxConns - 这样语义清晰:Nginx 负责分发确定性,后端负责执行细粒度策略
别忽略 client 到 Nginx 的并发限制
如果大量请求来自少数 IP,它们可能在 Nginx 入口就堆积,导致还没走到 upstream 就卡住。需同步控制入口层:
- 用
limit_conn_zone $binary_remote_addr zone=perip:10m;定义共享内存区 - 在 location 或 server 块中加
limit_conn perip 100;,限制单 IP 到 Nginx 的并发连接数 - 这虽不直接限制后端,但能防止上游流量洪峰冲击整个链路


















