详解Nginx http资源请求限制(三种方法)
前置条件:nginx需要有ngx_http_limit_conn_module和ngx_http_limit_req_module模块,可以使用命令2>&1nginx-V|tr'''\n'|greplimit检查有没有相应模块,如果没有请重新编译安装这两个模块。
测试版本为:nginx版本为1.15+
限制链接数
1.使用limit_conn_zone指令定义密钥并设置共享内存区域的参数(工作进程将使用此区域来共享密钥值的计数器)。第一个参数指定作为键计算的表达式。第二个参数zone指定区域的名称及其大小:
limit_conn_zone$binary_remote_addrzone=addr:10m;
2.在location{},server{}或者http{}上下文中使用limit_conn指令来应用限制,第一个参数为上面设定的共享内存区域名称,第二个参数为每个key被允许的链接数:
location/download/{ limit_connaddr1; }
使用$binary_remote_addr变量作为参数的时候,是基于IP地址的限制,同样可以使用$server_name变量进行给定服务器连接数的限制:
http{ limit_conn_zone$server_namezone=servers:10m; server{ limit_connservers1000; } }
限制请求速率
速率限制可用于防止DDoS,CC攻击,或防止上游服务器同时被太多请求淹没。该方法基于leakybucket漏桶算法,请求以各种速率到达桶并以固定速率离开桶。在使用速率限制之前,您需要配置"漏桶"的全局参数:
- key-用于区分一个客户端与另一个客户端的参数,通常是变量
- sharedmemoryzone-保留这些密钥状态的区域的名称和大小(即"漏桶")
- rate-每秒请求数(r/s)或每分钟请求数(r/m)("漏桶排空")中指定的请求速率限制。每分钟请求数用于指定小于每秒一个请求的速率。
这些参数使用limit_req_zone指令设置。该指令在http{}级别上定义-这种方法允许应用不同的区域并请求溢出参数到不同的上下文:
http{ #... limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s; }
使用此配置,将创建大小为10m字节,名称为one的共享内存区域。该区域保存使用$binary_remote_addr变量设置的客户端IP地址的状态。请注意,$remote_addr还包含客户端的IP地址,而$binary_remote_addr保留更短的IP地址的二进制表示。
可以使用以下数据计算共享内存区域的最佳大小:$binary_remote_addrIPv4地址的值大小为4个字节,64位平台上的存储状态占用128个字节。因此,大约16000个IP地址的状态信息占用该区域的1m字节。
如果在NGINX需要添加新条目时存储空间耗尽,则会删除最旧的条目。如果释放的空间仍然不足以容纳新记录,NGINX将返回503ServiceUnavailable状态代码,状态码可以使用limit_req_status指令重新定义。
一旦该区域被设置,你可以使用NGINX配置中的任何地方使用limit_req指令限制请求速率,尤其是server{},location{}和http{}上下文:
http{ #... limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s; server{ #... location/search/{ limit_reqzone=one; } } }
使用如上配置,nginx在/search/路由下将每秒处理不超过1个请求,延迟处理这些请求的方式是总速率不大于设定的速率。NGINX将延迟处理此类请求,直到"存储区"(共享存储区one)已满。对于到达完整存储桶的请求,NGINX将响应503ServiceUnavailable错误(当limit_req_status未自定义设定状态码时)。
限制宽带
要限制每个连接的带宽,请使用以下limit_rate指令:
location/download/{ limit_rate50k; }
通过此设置,客户端将能够通过单个连接以最高50k/秒的速度下载内容。但是,客户端可以打开多个连接跳过此限制。因此,如果目标是阻止下载速度大于指定值,则连接数也应该受到限制。例如,每个IP地址一个连接(如果使用上面指定的共享内存区域):
location/download/{ limit_connaddr1; limit_rate50k; }
要仅在客户端下载一定数量的数据后施加限制,请使用该limit_rate_after指令。允许客户端快速下载一定数量的数据(例如,文件头-电影索引)并限制下载其余数据的速率(使用户观看电影而不是下载)可能是合理的。
limit_rate_after500k; limit_rate20k;
以下示例显示了用于限制连接数和带宽的组合配置。允许的最大连接数设置为每个客户端地址5个连接,这适用于大多数常见情况,因为现代浏览器通常一次最多打开3个连接。同时,提供下载的位置只允许一个连接:
http{ limit_conn_zone$binary_remote_addresszone=addr:10m server{ root/www/data; limit_connaddr5; location/{ } location/download/{ limit_connaddr1; limit_rate_after1m; limit_rate50k; } } }
内容翻译自nginx请求限制部分文档,稍微调整了一点语义。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。