展开目录
nginx 限制访问频率
nginxngx_http_limit_req_module
X
陈尼玛的博客
记录开发生涯的踩坑经历,用时间来验证成长
加载中

虽然无法找到合适的方法对付百度云观测的流量攻击,但一个ab命令就把服务器跑崩掉不应该。所以我使用了nginx的ngx_http_limit_req_module 模块设置限制频率。

使用这个模块的流程是:

  1. 在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;
     ...
    }
  2. 在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变量

  1. nginx限制模块 ngx_http_limit_req_module

相关文档

暂无

随便看看

  1. cnpm 立即同步

  2. 华为等国产手机rem宽度超过实际宽度

  3. SSL certificate problem: self signed certificate in certificate chain

  4. jxa运动指令脚本

  5. python 用摄像头拍照并写入文件

  6. 搜索命令整理

  7. 判断变量是否 0 或者 '0'

  8. heroku登陆cli

  9. mongodb 批量修改字段语句

  10. 模拟307跳转情况

  11. 树莓派 3B/3B+ usb启动

  12. 单页应用的单向数据流的流程图

  13. dd备份/还原

  14. linux自启动/禁止自启动服务

  15. 把树莓派的存储空间拓展到整张TF卡中

  16. centos查看最近一次的开机时间

  17. mysql导出csv文件

  18. replace2正则扩展方法

畅言模块加载中