在http块中定义limit_conn_zone $server_name zone=by_server:10m,再于server块中用limit_conn by_server 2000限制该虚拟主机最大2000并发连接,可叠加per-IP限流,协同keepalive_timeout和upstream max_conns保护缓存资源。

直接在 http 块中定义一个全局 zone,再在目标 server 块里用 limit_conn 绑定它,就能限制该 server 接收的总并发连接数。这和按 IP 限流不冲突,可以叠加使用,是保障缓存资源不被单个服务实例吃光的关键手段。
定义 server 级别的共享计数区
必须放在 http{} 块内,不能嵌套在 server 或 location 中:
- 用
$server_name作为 key,可精准区分不同虚拟主机(比如api.example.com和static.example.com) - 示例:
limit_conn_zone $server_name zone=by_server:10m; - 10MB 内存足够存约 16 万个域名状态,对多数多租户或微服务网关场景够用
- 避免用
$uri或$args,键过多会快速耗尽内存,触发 503
在指定 server 中启用总量控制
把 zone 绑定到具体 server,设硬性上限:
server { listen 80; server_name api.example.com;-
limit_conn by_server 2000;—— 表示该 server 最多维持 2000 个并发 TCP 连接 - 这个数要结合后端缓存节点的连接承受能力设定,比如 Redis 默认 maxclients=10000,Nginx 到它的 upstream 连接应留出余量
- HTTP/2 下一个连接承载多个 stream,仍只计为 1 个连接;keepalive 空闲连接也持续占配额
配合缓存资源做协同保护
单纯限连接数还不够,需联动缓存层实际负载:
- 搭配
keepalive_timeout 15;缩短空闲连接生命周期,避免长连接长期占用配额 - 用
limit_conn_log_level error;把超限日志提级,方便快速发现缓存入口瓶颈 - 设
limit_conn_status 503;(或 429),让上游能明确识别是连接过载而非业务错误 - 若后端是缓存集群,可在
upstream块中设置max_conns,与 Nginx 的limit_conn形成双保险
和 per-IP 限流组合使用
防止单个恶意客户端打爆整个 server,也防止单个 server 吃掉全部缓存资源:
- 先定义 IP 级 zone:
limit_conn_zone $binary_remote_addr zone=perip:10m; - 在同一个
server块中同时写两行:limit_conn perip 20;和limit_conn by_server 2000; - 这样既保证每个真实客户端最多连 20 个,又确保所有客户端加起来不超过 2000 个
- 特别适合 CDN 回源、API 网关等需要兼顾公平性与总量可控的场景










