author:咔咔前端
wechat:fangkangfknode
这里我就复制一份别人写的不错的总结,我就简单说一下$binary_remote_addr这个参数,这个参数跟remoto_addr都是客户端ip的参数,可是$binary_remote_addr这个在存储的时候会比remote_addr少10来个字节,就这一个注意点后端
使用场景:服务器
咱们常常会遇到这种状况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,每每考虑对同一个ip的链接数,并发数进行限制。http_limit_conn_module 模块来实现。该模块能够根据定义的键来限制每一个键值的链接数,如同一个IP来源的链接数。并非全部的链接都会被该模块计数,只有那些正在被处理的请求(这些请求的头信息已被彻底读入)所在的链接才会被计数。http_limit_req_module 模块来实现,该模块能够经过定义的 键值来限制请求处理的频率。特别的,能够限制来自单个IP地址的请求处理频率。 限制的方法如同漏斗,每秒固定处理请求数,推迟过多请求。并发
二,配置语法日志
1,http_limit_conn_module指令解释code
limit_conn_zone
语法: limit_conn_zone $variable zone=name:size;
默认值: none
配置段: httpserver
该指令描述会话状态存储区域。键的状态中保存了当前链接数,键的值能够是特定变量的任何非空值(空值将不会被考虑)。$variable定义键,zone=name定义区域名称,后面的limit_conn指令会用到的。size定义各个键共享内存空间大小。如:
limit_conn_zone $binary_remote_addr zone=addr:10m;
注释:客户端的IP地址做为键。注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr变量。
$remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
$binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间能够保存3.2万个32位的状态,1.6万个64位的状态。
若是共享内存空间被耗尽,服务器将会对后续全部的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_zone 指令和limit_conn_zone指令同等意思,已经被弃用,就再也不作说明了。继承
limit_conn_log_level
语法:limit_conn_log_level info | notice | warn | error
默认值:error事务
配置段:http, server, location
当达到最大限制链接数后,记录日志的等级。
limit_conn
语法:limit_conn zone_name number
默认值:none
配置段:http, server, location
指定每一个给定键值的最大同时链接数,当超过这个数字时被返回503 (Service Temporarily Unavailable)错误。如:
limit_conn_zone $binary_remote_addrzone=addr:10m;
server{
location /www.baidu.com/{
limit_conn addr 1;
}
}
同一IP同一时间只容许有一个链接。
当多个 limit_conn 指令被配置时,全部的链接数限制都会生效。好比,下面配置不只会限制单一IP来源的链接数,同时也会限制单一虚拟服务器的总链接数:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
limit_conn perip 10;
limit_conn perserver 100;
}
[warning]limit_conn指令能够从上级继承下来。[/warning]
limit_conn_status
语法: limit_conn_status code;
默认值: limit_conn_status 503;
配置段: http, server, location
该指定在1.3.15版本引入的。指定当超过限制时,返回的状态码。默认是503。
limit_rate
语法:limit_rate rate
默认值:0
配置段:http, server, location, if in location
对每一个链接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 按链接限速而不是按IP限制,所以若是某个客户端同时开启了两个链接,那么客户端的总体速率是这条指令设置值的2倍。
完整实例配置
http{
limit_conn_zone$binary_remote_addrzone=limit:10m;
limit_conn_log_level info;
server{
location ^~/download/{
limit_conn limit 4;
limit_rate 200k;
/data/www.baidu.com/download/;
}
}
}
使用注意事项
事务都具备两面性的。http_limit_conn_module 模块虽然说能够解决当前面临的并发问题,可是会引入另一些问题的。如前端若是有作LVS或反代,而咱们后端启用了该模块功能,那不是很是多503错误了?这样的话,能够在前端启用该模块,要么就是设置白名单,白名单设置参见后续的文档。
2,ngx_http_limit_req_module模块指令
limit_req_zone
语法: limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
设置一块共享内存限制域用来保存键值的状态参数。 特别是保存了当前超出请求的数量。 键的值就是指定的变量(空值不会被计算)。如
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
说明:区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次。
键值是客户端IP。
使用$binary_remote_addr变量, 能够将每条状态记录的大小减小到64个字节,这样1M的内存能够保存大约1万6千个64字节的记录。
若是限制域的存储空间耗尽了,对于后续全部请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度能够设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,因此若是你须要指定每秒处理少于1个的请求,2秒处理一个请求,可使用 “30r/m”。
limit_req_log_level
语法: limit_req_log_level info | notice | warn | error;
默认值: limit_req_log_level error;
配置段: http, server, location
设置你所但愿的日志级别,当服务器由于频率太高拒绝或者延迟处理请求时能够记下相应级别的日志。 延迟记录的日志级别比拒绝的低一个级别;好比, 若是设置“limit_req_log_level notice”, 延迟的日志就是info级别。
limit_req_status
语法: limit_req_status code;
默认值: limit_req_status 503;
配置段: http, server, location
该指令在1.3.15版本引入。设置拒绝请求的响应状态码。
limit_req
语法: limit_req zone=name [burst=number] [nodelay];
默认值: —
配置段: http, server, location
设置对应的共享内存限制域和容许被处理的最大请求数阈值。 若是请求的频率超过了限制域配置的值,请求处理会被延迟,因此全部的请求都是以定义的频率被处理的。 超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这时,这个请求会被终止,并返回503 (Service Temporarily Unavailable) 错误。这个阈值的默认值为0。如:
limit_req_zone $binary_remote_addr zone=creq:10 mrate=1r/s;
server{
location /www.baidu.com/{
limit_req zone=creq burst=5;
}
}
限制平均每秒不超过一个请求,同时容许超过频率限制的请求数很少于5个。
若是不但愿超过的请求被延迟,能够用nodelay参数,如:
limit_req zone=ttlsa_com burst=5 nodelay;
完整实例配置
http{
limit_req_zone $binary_remote_addr zone=creq:10m rate=1r/s;
server{
location ^~/download/{
limit_req zone=creq burst=5;
data/www.baidu.com/download/;
}
}
}
可能要对某些IP不作限制,须要使用到白名单。