直接在server块中用limit_conn绑定按$server_name定义的zone可限制该虚拟主机并发TCP连接总数,适用于防止静态资源被某类流量独占;需先在http{}中定义limit_conn_zone $server_name zone=server_total:10m,再在server{}中配置limit_conn server_total 500,并建议叠加per-IP限流及设置429状态码提升可观测性。

直接在 server 块里用 limit_conn 绑定一个按域名($server_name)定义的 zone,就能限制这个虚拟主机整体的并发连接总数。它不看是谁来的,只管当前这个站点总共接了多少 TCP 连接,特别适合保障静态资源服务不被某类流量(比如大量图片请求)独占带宽和连接槽位。
1. 先定义 server 级别的共享内存区
这一步必须放在 http{} 块最外层,相当于建一张“按域名统计连接数”的表:
limit_conn_zone $server_name zone=server_total:10m;
其中 $server_name 是 Nginx 内置变量,值就是你 server_name example.com; 里写的域名;server_total 是自定义 zone 名,后面 limit_conn 会引用它;10m 表示分配 10MB 内存,足够存几万个不同域名的状态(单租户场景下基本够用)。
2. 在 server 块中启用总连接限制
把限制加在 server{} 块一级,对所有进该站点的请求生效(包括 /static/、/img/、API 代理、甚至被重写到 index.html 的前端路由):
-
limit_conn server_total 500;—— 表示整个站点最多维持 500 个并发 TCP 连接
注意:这个数值不是“每秒请求数”,而是同时打开的连接数量。HTTP/2 下一个连接可承载多个请求,但只算 1 个;keepalive 空闲连接也持续占配额,建议搭配 keepalive_timeout 15; 防止连接长期滞留。
3. 和 per-IP 限流配合使用更稳妥
单靠 server 总量控制不够精细,容易被单个恶意 IP 用满全部配额。推荐叠加 IP 维度限制,形成双层防护:
- 在
http{}块再加一行:limit_conn_zone $binary_remote_addr zone=perip:10m; - 在同个
server{}块里加上:limit_conn perip 20;
这样既防住某个 IP 疯狂建连(最多 20 个),又守住整站上限(最多 500 个),静态资源请求就不会因为某类流量突增而拿不到连接槽位。
4. 提升可观测性与响应语义
加两行配置让限流行为更可控、更容易排查:
-
limit_conn_log_level error;—— 把触发限流的日志级别提到error,避免刷屏warn -
limit_conn_status 429;—— 返回429 Too Many Requests,比默认503更符合限流语义,前端也更容易识别处理










