max_conns需满足Nginx≥1.11.5、least_conn或ip_hash算法、至少两台server等前提才生效;须配合keepalive及HTTP/1.1长连接使用,并可选queue实现柔性排队。

max_conns 是 upstream 中用于防止单个后端节点连接溢出的关键参数,但它不是“一设就灵”的开关,必须满足特定条件才能真正起作用。
确认前提条件是否满足
该参数只在以下场景下生效:
- Nginx 版本 ≥ 1.11.5(开源版)或使用 Nginx Plus;低于此版本会直接忽略该配置
- upstream 使用的负载均衡算法必须支持连接计数,目前只有 least_conn 和 ip_hash 会检查 max_conns;默认的 round_robin 完全不识别它
- upstream 至少包含两台 server;若只配了一台,max_conns 不触发限流逻辑
- 不能与 hash、random 等不维护连接状态的策略混用
正确写法与典型配置
max_conns 必须写在 upstream 块内的 server 行中,格式为:
upstream backend {
server 192.168.1.10:8080 max_conns=150;
server 192.168.1.11:8080 max_conns=150;
}
- 默认值为 0,表示不限制;设为正整数才启用限制
- 数值应略低于后端真实承载能力(如 Tomcat 的 maxConnections 或应用连接池上限),建议取其 80%~90%
- 多 worker 进程下,总并发仍可能超过单机 max_conns 总和——这是正常行为,因为它是每 server 的连接数上限,不是全局总限
必须配合 keepalive 才能稳定生效
若未启用长连接,Nginx 默认用短连接处理请求,连接建了就断,max_conns 很难被持续触达,形同虚设。
- 在 upstream 块中添加:keepalive 64;(数字建议为后端连接池大小的 1/2~1/3)
- 在对应 location 中启用 HTTP/1.1 长连接代理:
proxy_http_version 1.1;
proxy_set_header Connection ''; - 避免后端因频繁握手、TIME_WAIT 积压而提前拒绝连接
增强防护:搭配 queue 实现柔性排队
当连接达 max_conns 上限时,Nginx 默认直接拒绝新请求(返回 502)。可通过 queue 提升容错性(需 Nginx 1.23.3+ 或 Nginx Plus):
server 192.168.1.10:8080 max_conns=150 queue=10 timeout=30s;
- queue=10 表示最多允许 10 个请求排队等待空闲连接
- timeout=30s 是排队最大等待时间,超时则返回 503
- 这比硬拒绝更友好,尤其适用于突发流量场景


















