应使用空字符串key在http块定义limit_conn_zone,server块内用limit_conn设硬上限,配合日志级别、状态码和keepalive超时提升可观测性与稳定性。

要限制单个 Server 维度的最大总连接数,本质是让 Nginx 对该虚拟主机(即整个 server 块)所有入站 TCP 连接统一计数并设硬上限,不区分客户端来源,从而防止某个域名独占全部连接资源,保障多业务或租户间的负载均衡与资源公平分配。
用固定 key 定义全局连接计数区域
必须在 http{} 块顶层定义共享内存区,key 要恒定不变,确保所有连接归入同一计数桶:
- 推荐写法:
limit_conn_zone "" zone=server_total:10m;—— 空字符串作为 key,所有命中该 server 的连接都计入总数 - 也可用
$server_name(如站点唯一、无泛域名),但空字符串更稳妥,避免因多server_name或通配符导致意外分桶 -
zone=server_total:10m表示分配 10MB 共享内存,64 位系统下约支持 16 万个连接状态,远超常规需求 - 切勿使用
$host或$http_host,它们可被客户端伪造,不安全
在目标 server 块中启用硬性上限
把 limit_conn 指令放在具体 server{} 块内,绑定上一步定义的 zone:
- 例如:
limit_conn server_total 800;表示该 server 最多维持 800 个并发 TCP 连接 - 所有流量都计入:HTTP/1.1 请求、HTTP/2 多路复用连接(整条连接计为 1)、keepalive 空闲连接、健康检查探针、静态资源请求等
- 超过即刻拒绝新连接,不排队、不缓冲;已建立连接不受影响
- 若需叠加单 IP 防护,可额外定义
per_ipzone 并在同一 server 中添加limit_conn per_ip 20;
增强行为可控性与问题定位能力
仅设上限容易“静默失败”,加几行配置能显著提升可观测性:
-
limit_conn_log_level error;:将限流触发日志升为error级,避免被大量warn冲刷,便于监控告警识别 -
limit_conn_status 429;:返回标准429 Too Many Requests,语义明确,前端和 APM 工具可自动识别为限流而非服务故障 - 建议同步设置
keepalive_timeout 15;,避免长连接长期滞留占用配额
常见误区与注意事项
实际部署中几个关键点容易出错:
- zone 定义必须在
http{}块,不能写在server或location内;limit_conn指令则必须在server{}块内——两者缺一不可 - 不要混淆
limit_conn和limit_req:limit_conn控制连接数,粒度粗、开销低;limit_req控制请求速率,适合 API 路径级防护 - HTTP/2 下一个连接承载多个请求,此时总连接限制仍是有效兜底手段,但无法替代请求级限流
- 若 server 同时监听多个域名(如泛域名或多个
server_name),用空字符串 key 更可靠;若严格单域名,$server_name亦可,但需确认无别名或通配混用










