limit_conn 模块如何限制并发连接数
在 nginx 中,使用 ngx_http_limit_conn_module 模块来限制并发连接数。核心做法是在 http 块中使用 limit_conn_zone 定义共享内存区域和键(如 $binary_remote_addr),然后在 server 或 location 块中使用 limit_conn 指令绑定该区域并指定最大连接数。当客户端 ip 的连接数超过设定值时,nginx 会返回 503 service unavailable 错误。

不同键值(IP vs Server Name)对限流效果的影响
通过修改 limit_conn_zone 的键参数,可以改变限流的粒度。使用 $binary_remote_addr 是按单个 IP 地址限制总连接数;而使用 $server_name 则是按虚拟主机名称限制所有访问该主机的总连接数。前者适合保护后端服务免受特定 IP 攻击,后者适合控制整个站点的整体负载。

worker_processes 1;
events {
worker_connections 1024;
}
http {
# 定义按 IP 限流的区域,大小 10m
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 定义按域名限流的区域,大小 10m
limit_conn_zone $server_name zone=perserver:10m;
server {
listen 80;
server_name example.com;
# 应用 IP 限流:每个 IP 最多 10 个并发连接
limit_conn perip 10;
# 应用域名限流:整个站点最多 100 个并发连接
limit_conn perserver 100;
location / {
proxy_pass http://backend;
}
}
}
连接数超限时的具体行为与状态码
当并发连接数超过 limit_conn 设定的阈值时,Nginx 会立即拒绝新的连接请求。默认情况下,Nginx 会返回 HTTP 503 (Service Temporarily Unavailable) 状态码。可以通过 limit_conn_status 指令自定义返回的状态码,例如改为 429 (Too Many Requests)。此外,limit_conn_log_level 可以控制记录拒绝日志的级别,通常设为 info 或 warn 以便排查问题。

# 自定义限流返回状态码为 429 limit_conn_status 429; # 设置日志级别为 info limit_conn_log_level info;











