【Nginx】利用Nginx进行请求控制

it2024-11-23  19

请求限制

Nginx处理HTTP请求的11个阶段

在 preaccess 阶段在 access 阶段之前,主要是限制用户的请求,比如并发连接数(limit_conn模块)和每秒请求数(limit_req 模块)等。这两个模块对于预防一些攻击请求是很有效的。

limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”。limit_req_conn 用来限制同一时间连接数,即并发限制。

limit_conn 模块

限制单个 ip 的建立连接的个数。

http { ... #分配共享内存 #如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回503 limit_conn_zone $binary_remote_addr zone=addr:10m server { ... location / { #对于连接拒绝的请求,返回设置的状态码,默认是 503 limit_conn_status 500; #当达到最大限制连接数后,记录日志的等级 limit_conn_log_level warn; # 限制向用户返回的速度,每秒50个字节 limit_rate 50; #限制请求的并发连接数(同一个ip $binary_remote_addr) limit_conn addr 10; } } }

具体语法:

limit_conn_zone 语法: limit_conn_zone key zone=name:size;(设置限制规则、区域名称及分配的内存大小) 可配置区域: http key:必选项;设置限制规则;取值可以是text文本、nginx变量或两者的组合;实例中使用的nginx变量$binary_remote_addr表示根据每个ip限制并发 name: 必选项; 自定义一个区域名称; 任意字符串 size: 分配内存的大小

limit_conn 语法:limit_conn zone number; (使用由limit_conn_zone定义的拦截规则,并设置具体的限制连接数量) 可配置区域: http, server, location zone: 必选项; 由limit_conn_zone(zone=name)定义的名称; 表示使用定义的哪个限制规则 number: 必选项; 正整数;表示具体的限制连接数量

limit_conn_status 语法: limit_conn_status code; 默认值: 503 可配置区域: http,server, location 表示超出limit_req配置的请求数量后返回给客户端的错误码使用该指令

limit_conn_log_level 语法: limit_conn_log_level info | notice | warn |error; 默认值: limit_conn_log_level error; 可配置区域: http, server, location 当服务器拒绝处理由于速率超过或延迟请求处理而拒绝处理请求时,设置所需的日志记录级别。

limit_conn_dry_run: 这个指令是 1.17.6 版本中才出现的,用于设置演习模式。在这个模式中,连接数不受限制。但是在共享内存的区域中,过多的连接数也会照常处理。

limit_req模块

主要用于处理突发流量,它基于漏斗算法将突发的流量限定为恒定的流量。

限流算法

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit; } } //Nginx的限流统计是基于毫秒的,我们设置的速度是2r/s, //转换一下就是500ms内单个IP只允许通过1个请求,从501ms开始才允许通过第二个请求。

添加缓存

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit burst=4 nodelay; limit_req_status 598; //自定义状态码 } } //加入了burst=4; //每个key(此处是每个IP)最多允许4个突发请求的到来。是让多余的请求可以先放到队列里,慢慢处理。 //加入nodelay 令牌桶算法 立刻处理4个 //不加,漏桶算法 按速率处理4个,即4+500ms

语法:

limit_req_zone 语法: limit_req_zone key zone=name:size rate=rate;(可理解为该指令用来定义限制请求频率) 可配置区域: http key: 必选项;取值范围: 1,text(文本); 2,nginx变量;3,text和nginx变量的组合; name: 必选项;自定义字符串 size: 必选项;分配内存大小,用来保存键值的状态参数 rate: 必选项;每秒可请求的频率(r/s), 或每分钟可请求的频率(r/m)

limit_req 语法: limit_req zone=name [burst=number] [nodelay]; (可理解为使用定义的限制请求频率,一定是先定义后使用!也就是一定要有limit_req_zone指令的配置后才能使用该配置) 可配置区域: http, server, location name: 必选项;自定义字符串, 名字必须与limit_req_zone中zone=name这个名字一致 number: 必选项;正整数数字, 平均每秒允许不超过limit_req_zone指令中rate规定的请求数,并且不会超过该值所指定数量的请求,可延迟请求的数量 nodelay: 可选配置,表示请求频率超过rate规定值后又超过burst规定值后立即返回客户端503(可设置返回code)

limit_req_status 语法: limit_req_status code; 默认值: 503 可配置区域: http, server, location 表示超出limit_req配置的请求数量后返回给客户端的错误码使用该指令

limit_req_log_level 语法: limit_req_log_level info | notice | warn | error; 默认值: limit_req_log_level error; 可配置区域: http, server, location 当服务器拒绝处理由于速率超过或延迟请求处理而拒绝处理请求时,设置所需的日志记录级别。

最新回复(0)