NGINX限制连接的实践 (Defense DDOS)

关于限制用户连接,Nginx 提供的模块: [ ngx_http_limit_req_module ] [ ngx_http_limit_conn_module ] , 还有 stream 模块也包含类似的功能, 本文只说明 ngx_http_limit_req_module 的使用.

ngx_http_limit_req_module 配置

http {      limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;        ...        server {            ...          limit_req zone=one burst=5;            location /search/ {              limit_req zone=one burst=5;          }          ...  }  

 

参数说明

$binary_remote_addr : 二进制远程地址

zone=one:10m : 定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话

rate=10r/s : 限制频率为每秒10个请求

burst=5 : 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。

遇到的问题

拟定这样一个场景:

一次正常请求返回 50 个 HTML 页面,总共用时10s。 如果在一个500人的场所中,单个客户端 IP 发出的最大请求数会是: 500/10 * 500 = 2500.

所以,为了不影响正常用户的访问,我似乎只能做如下设置: rate=2500r/s. 显然,这样的设置是不合理的。

如何解决这个问题 ?

如果不是以 IP 作为记录的标准,而是请求的 URI, 那么问题就可以解决!

在 limite_req_zone key zone=name:size rate=rate 中的 key 设定为: $remote_addr$uri , 如下:

limit_req_zone "$remote_addr$uri" zone=one:10m rate=1r/s;  

 

ab测试

ab -n 1000 -c 100 http://xx.xx.xx.xx/uri  

 

ps: 这个解决方式是一个萌萌哒的同事想出来的.

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。
超哥软件库 » NGINX限制连接的实践 (Defense DDOS)