虽然无法找到合适的方法对付百度云观测的流量攻击,但一个ab命令就把服务器跑崩掉不应该。所以我使用了nginx的ngx_http_limit_req_module 模块设置限制频率。
使用这个模块的流程是:
在http节内定义 req_limit_zone
ngx_http_limit_req_module模块限制方式语法:
limit_req_zone 键值 zone=名称:存储空间大小 rate=多少次/单位时间;
键值
可以是普通字符串或者内置的变量,模块根据此键值统计访问的次数,从而计算出访问频率是否符合预设值。例如用 $binary_remote_addr 作为键值时,可以统计同一个来路ip的访问频率。名称
就是一个变量,用来给limit_req
指令使用的。次数是一个整数,单位时间可以是秒s
或者分钟m
。存储空间用来存放请求访问的状态,一兆字节的区域可以保留约16000个64字节的状态或大约8千128个字节的状态。比如下面这句话限制了一个ip 在 3秒内只能访问2次(因为次数必须是整数,所以这里取1分钟40次):http{ limit_req_zone $binary_remote_addr zone=ip32:10m rate=40r/m; ... }
在http,server或者location里写 limit_req 命令 limit_req语法:
limit_req zone=已定义的limit_req_zone名称 burst=突发请求数 是否nodelay;
如果请求频率符合zone的预设值,那么burst和nodelay没有作用。现在假定预设值为 1r/s ,brust=2,未设置nodelay。实际第一秒发生了5个请求,则第一个请求毫无疑问被处理了,第二个和第三个被挂起,等到第二秒处理,最后两个直接返回503错误。
nodelay
如果被设置了,那么2和3会在第一秒被处理,4和5同样得到503错误,而第二秒不处理任何请求。如果burst和nodelay都不写的话,那么默认是burst=0,没有nodelay。http{ ... server{ ... limit_req zone=ip32 burst=2 nodelay; } }
limit_req写在server里的时候没有什么歧义,而写在location里面时就要注意了,如果后面是rewrite跳转的情况,当前limit_req限制就会无效,必须要写到实际处理的那个location才可以。return也是这样,因为return并没有发生实际的请求,因此nginx不统计访问频率。
参考: 0. 内置的nginx变量
相关文档
暂无
随便看看