一、nginx限制请求
1、基本配置
ngx_http_limit_req_module
限制请求处理速率,特别是来自单个IP的请求处理速率
1、limit_req_zone
Syntax: limit_req_zone key zone=name:size rate=rate [sync];
Context: http
2、limit_req
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Context: http, server, location
3、配置
http {
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; 定义
#限制请求 二进制地址 限制策略的名 占用10M空间 允许每秒1次请求
location / {
limit_req zone=req_zone;
#limit_req zone=req_zone burst=5;
#limit_req zone=req_zone burst=5 nodelay;
}
}
1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
4、重启并测试
ab -n 10 -c 10
主要看complete requests和Failed requests和最后的longest request
2、部分说明
1、limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
这里使用的是 binary_remote_addr 变量,而不是 remote_addr 变量。
$binary_remote_addr是$remote_addr(客户端IP)的二进制格式。
remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
zone=one:10m表示:内存区域名称为one(自定义),占用空间大小为10m,,用来存储访问的频次信息
rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次(平均处理的请求频率不能超过每秒一次)
2、limit_req zone=req_zone burst=5 nodelay;
zone=req_zone设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访
问频次限制的请求可以先放到这个缓冲区内
nodelay字面的意思是不延迟,具体说是对用户发起的请求不做延迟处理,而是立即处理。比如我上面定义的rate=1r/s,即每秒钟只处理1个
请求。如果同一时刻有两个后缀为/search的请求过来了,若设置了nodelay,则会立刻处理这两个请求。若没设置nodelay,则会严格执行
rate=1r/s的配置,即只处理一个请求,然后下一秒钟再处理另外一个请求。直观的看就是页面数据卡了,过了一秒后才加载出来。
如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队
3、三种配置的区别(rate=1r/s)
#limit_req zone=req_zone;
在1秒内收到10个请求,除了响应第一个请求状态为200,立马响应其他请求状态为503
#limit_req zone=req_zone burst=5;
在1秒内收到10个请求,立马响应第一个请求状态为200,然后立马响应10-1-5=4个请求状态为503,再每秒一次响应,响应5个请求状态为200
#limit_req zone=req_zone burst=5 nodelay;
在1秒内收到10个请求,立马响应1+5=6个请求状态为200,立马响应剩下的请求状态为503
二、nginx限制连接
1、基本配置
ngx_http_limit_conn_module
通过IP地址,限制链接(TCP)
用于限制每个已定义关键字的连接数,特别是来自单个IP地址的连接数
并非所有连接都被计数,仅当连接是服务器正在处理的请求且已读取整个请求头时,才对连接进行计数
1、limit_conn_zone
Syntax: limit_conn_zone key zone=name:size;
Context: http
2、limit_conn
Syntax: limit_conn zone number;
Context: http, server, location
3、配置
http {
limit_conn_zone $binary_remote_addr zone=conn_zone:1m; #方便测试结果改成1m
location / {
limit_conn conn_zone 1;
}
}
limit_conn_zone:全局定义限制对象(IP),存储区限制空间(1M)字节
limit_conn:该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有2个连接):
1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
4、重启并测试
ab -n 1000 -c 100
需要注意的是,当-c和-n设置较小时,可能无法出现503状态
2、部分说明
# $binary_remote_addr:客户端地址(二进制形式),对于IPv4地址,值的长度始终为4个字节,对于IPv6地址,值的长度始终为16个字节.
# 定义名为'conn_zone'的共享内存区域,用于针对单个客户端地址计数.
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
# $server_name:接受请求的服务器的名称.
limit_conn_zone $server_name zone=server_conn_zone:1m;
limit_conn conn_zone 1;
limit_conn server_conn_zone 1;
limit_conn_zone $binary_remote_addr zone=conn_zone:10m模块开启对单个ip、单个会话同时存在的连接数的限制。这里定义一个记录
区conn_zone,conn_zone的总容量是10m,该记录区针对于变量 $binary_remote_add生效,这里是针对单个IP生效。该模块只是一个定义,
配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn conn_zone 1表示该location段使用conn_zone定义的
limit_conn_zone ,对单个IP限制同时存在一个连接。
三、nginx限制速率
1、基本配置
ngx_http_core_module
1、limit_rate
通过此设置,可以限制每个连接的带宽,但是客户端可以打开多个连接,所以总流量并不会变小,只是可以避免单个连接独占带宽,
使下载更加均衡。
Syntax: limit_rate rate;
Default: limit_rate 0;
Context: http, server, location, if in location
example:
# 限制下载速度为50kb/s
limit_rate 50k;
# 限制下载速度为5m/s
limit_rate 5m;
2、limit_rate_after
允许客户端快速下载一定数量的数据后,再限制下载其余数据的速率。
Syntax: limit_rate_after size;
Default: limit_rate_after 0;
Context: http, server, location, if in location
3、设置
# 前500kb速度可以全速下载,之后限速100k/s
limit_rate_after 500k;
limit_rate 100k;