limit_conn_zone是 Nginx 的连接限制模块,用于限制客户端的并发连接数,防止单个客户端建立过多连接导致服务器资源耗尽。
limit_conn_zone 指令
语法:
limit_conn_zone key zone=name:size;
作用:定义连接限制的共享内存区域
参数说明:
key:限制的键值,通常使用客户端标识zone=name:size:定义共享内存区域名称和大小name:区域名称(自定义)size:内存区域大小(如 10m、100k)
示例:
bash
# 按IP限制连接数
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 按服务器名称限制
limit_conn_zone $server_name zone=servers:10m;
# 按自定义变量限制
limit_conn_zone $custom_key zone=custom:10m;
limit_conn 指令
语法:
limit_conn zone number;
作用:在具体位置启用连接数限制
参数:
zone:使用的共享内存区域名称number:允许的最大并发连接数
示例:
location /download/ {
limit_conn addr 1; # 每个IP最多1个并发连接
}
完整案例
bash
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;
server {
server_name limit.taohui.tech;
root html/;
error_log logs/myerror.log info;
location /{
limit_conn_status 500;
limit_conn_log_level warn;
limit_rate 50;
limit_conn addr 1;
#limit_req zone=one burst=3 nodelay;
limit_req zone=one;
}
}
共享内存区定义
bash
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;
limit_conn_zone - 连接限制共享内存区
- 作用:为连接限制创建共享内存区,存储每个客户端的连接状态
- 参数详解 :
$binary_remote_addr:以客户端的二进制IP地址作为键值zone=addr:10m:创建名为addr的共享内存区,大小为10MB- 容量计算:10MB可存储约16万个IP地址的状态信息
limit_req_zone - 请求限制共享内存区
- 作用:为请求频率限制创建共享内存区,实现漏桶算法
- 参数详解 :
$binary_remote_addr:以客户端IP作为键值zone=one:10m:创建名为one的共享内存区,大小为10MBrate=2r/m:限制频率为每分钟2个请求(约每30秒1个请求)
Server块配置
bash
server {
server_name limit.taohui.tech;
root html/;
error_log logs/myerror.log info;
- server_name:虚拟主机域名
- root:网站根目录
- error_log:错误日志路径和级别(info级别会记录限流相关日志)
Location块限流配置
location / {
limit_conn_status 500;
limit_conn_log_level warn;
limit_rate 50;
limit_conn addr 1;
#limit_req zone=one burst=3 nodelay;
limit_req zone=one;
}
连接限制相关指令
| 指令 | 默认值 | 说明 |
|---|---|---|
limit_conn_status |
503 | 连接数超限时返回的HTTP状态码(此处设为500) |
limit_conn_log_level |
error | 连接限制的日志级别(warn级别记录警告) |
limit_conn addr 1 |
- | 每个IP最多允许1个并发连接 |
请求限制相关指令
# 当前生效的配置
limit_req zone=one;
# 被注释的配置(替代方案)
#limit_req zone=one burst=3 nodelay;
两种限流模式对比:
模式一:严格限流(当前使用)
limit_req zone=one;
- 效果:严格按照每分钟2个请求的频率
- 请求处理:超过频率的请求立即返回503错误
- 特点:无缓冲,严格限制
模式二:缓冲限流(被注释)
limit_req zone=one burst=3 nodelay;
burst=3:允许突发3个请求进入队列nodelay:突发请求立即处理,不延迟- 效果:基础频率2r/m,但允许短时间内突发3个请求
带宽限制
limit_rate 50;
- 限制客户端下载速度为50字节/秒
- 这是非常低的速度,主要用于测试或限制滥用
配置效果分析
适用场景
- API防护:防止接口被频繁调用
- 下载限制:限制资源下载速度
- 防爬虫:限制爬虫的请求频率
- 防CC攻击:减缓连接耗尽攻击
触发限制时的行为
- 连接数超限:返回HTTP 500错误,记录warn级别日志
- 请求频率超限:返回HTTP 503错误(默认)
- 日志记录 :在
logs/myerror.log中记录详细信息
配置优化建议
调整限流参数
bash
# 更合理的生产环境配置示例
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
location / {
limit_conn addr 10; # 适当增加并发连接数
limit_rate 100k; # 调整带宽限制
limit_req zone=one burst=20 nodelay; # 启用突发处理
}
差异化限流策略
bash
# 对静态资源宽松限制
location ~* \.(jpg|css|js)$ {
limit_req zone=one burst=50;
limit_conn addr 5;
}
# 对API严格限制
location /api/ {
limit_req zone=one burst=5;
limit_conn addr 2;
}
这个配置提供了非常严格的访问限制,适合用于保护敏感接口或防止资源滥用。