Nginx使用limit_req_zone对同一IP访问进行限流的方法

 更新时间:2019年08月30日 10:40:26   作者:可可keketrtr  
今天小编就为大家分享一篇Nginx使用limit_req_zone对同一IP访问进行限流的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

nginx可以使用ngx_http_limit_req_module模块的limit_req_zone指令进行限流访问,防止用户恶意攻击刷爆服务器。ngx_http_limit_req_module模块是nginx默认安装的,所以直接配置即可。

首先,在nginx.conf文件中的http模块下配置

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

说明:区域名称为one(自定义),占用空间大小为10m,平均处理的请求频率不能超过每秒一次。

$binary_remote_addr是$remote_addr(客户端IP)的二进制格式,固定占用4个字节(可能是C语言的long类型长度)。而$remote_addr按照字符串存储,占用7-15个字节。这样看来用$binary_remote_addr可以节省空间,但网上又说64位系统下都是占用64个字节,没搞清楚,总之尽量用$binary_remote_addr吧。

第二,在http模块的子模块server下面配置

location ~* .htm$ {
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend_tomcat;
}

我这里是对uri后缀为htm的请求限流,注意limit_req zone=one burst=5 nodelay;

其中zone=one和前面的定义对应。

burst这个网上都说峰值之类的,通过亲自试验发现这么说并不准确,应该叫缓冲队列的长度比较合适。

nodelay字面的意思是不延迟,具体说是对用户发起的请求不做延迟处理,而是立即处理。比如我上面定义的rate=1r/s,即每秒钟只处理1个请求。如果同一时刻有两个后缀为htm的请求过来了,若设置了nodelay,则会立刻处理这两个请求。若没设置nodelay,则会严格执行rate=1r/s的配置,即只处理一个请求,然后下一秒钟再处理另外一个请求。直观的看就是页面数据卡了,过了一秒后才加载出来。

真正对限流起作用的配置就是rate=1r/s和burst=5这两个配置。下面我们来分析一下具体案例。

某一时刻有两个请求同时到达nginx,其中一个被处理,另一个放到了缓冲队列里。虽然配置了nodelay导致第二个请求也被瞬间处理了,但还是占用了缓冲队列的一个长度,如果下一秒没有请求过来,这个占用burst一个长度的空间就会被释放,否则就只能继续占用着burst的空间,直到burst空间占用超过5之后,再来请求就会直接被nginx拒绝,返回503错误码。

可见,如果第二秒又来了两个请求,其中一个请求又占用了一个burst空间,第三秒、第四秒直到第五秒,每秒都有两个请求过来,虽然两个请求都被处理了(因为配置了nodelay),但其中一个请求仍然占用了一个burst长度,五秒后整个burst长度=5都被占用了。第六秒再过来两个请求,其中一个请求就被拒绝了。

这是我根据实际测试结果推论的,可能和真实的理论有所出入,但这样讲我觉得比较好理解。有清楚的朋友欢迎告知!

这里用到的$binary_remote_addr是在客户端和nginx之间没有代理层的情况。如果你在nginx之前配置了CDN,那么$binary_remote_addr的值就是CDN的IP地址。这样限流的话就不对了。需要获取到用户的真实IP进行限流。

简单说明如下:

## 这里取得原始用户的IP地址
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$$firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=one:10m rate=1r/s;

同理,我们可以用limit模块对网络爬虫进行限流。

http模块

limit_req_zone $anti_spider zone=anti_spider:10m rate=1r/s;

server模块

location / {

limit_req zone=anti_spider burst=2 nodelay;
if ($http_user_agent ~* "spider|Googlebot") {
set $anti_spider $http_user_agent;
}

}

可以用curl -I -A "Baiduspider" www.remotejob.cn/notice.jsp 测试一下

以上这篇Nginx使用limit_req_zone对同一IP访问进行限流的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解nginx惊群问题的解决方式

    详解nginx惊群问题的解决方式

    这篇文章主要介绍了详解nginx惊群问题的解决方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 利用nginx实现动静分离的负载均衡集群实战教程

    利用nginx实现动静分离的负载均衡集群实战教程

    这篇文章介绍了利用nginx实现动静分离的负载均衡集群实战,本次用到的操作系统及服务,本次实验一共需要3台服务器,一台nginx做为负载均衡分发器和动静分离的分发器,两台apache做为后端服务器,使用nginx实现两台apache服务器的负载均衡和动静分离,需要的朋友可以参考下
    2023-03-03
  • Linux下安装配置nginx详解

    Linux下安装配置nginx详解

    本篇文章主要介绍了Linux下安装配置nginx,介绍了在Linux系统下安装配置Nginx的详细过程,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • Nginx中return和rewrite的写法及区别浅析

    Nginx中return和rewrite的写法及区别浅析

    在Nginx中,return和rewrite都用于重定向,但有所区别,return立即终止请求并返回指定HTTP状态码,不额外请求,rewrite则重写URI并引发新请求,需要的朋友可以参考下
    2024-09-09
  • nginx部署前端项目的超级详细步骤记录

    nginx部署前端项目的超级详细步骤记录

    众所周知Nginx是一款高性能的http服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,这篇文章主要给大家介绍了关于nginx部署前端项目的超级详细步骤,需要的朋友可以参考下
    2023-02-02
  • keepalived监控nginx进程的实现示例

    keepalived监控nginx进程的实现示例

    本文主要介绍了keepalived监控nginx进程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • nginx网页缓存时间的配置过程

    nginx网页缓存时间的配置过程

    Nginx缓存的设置可以提高网站性能,对于网站的图片,尤其是新闻网站,下面这篇文章主要给大家介绍了关于nginx网页缓存时间的配置过程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • 常见的Nginx配置误区

    常见的Nginx配置误区

    对很多人而言,配置Nginx+PHP无外乎就是搜索一篇教程,然后拷贝粘贴。听上去似乎也没什么问题,可惜实际上网络上很多资料本身年久失修,漏洞百出,如果大家不求甚解,一味的拷贝粘贴,早晚有一天会为此付出代价
    2014-03-03
  • nginx里集成php模块安装配置步骤详解

    nginx里集成php模块安装配置步骤详解

    这篇文章主要为大家介绍了nginx里集成php模块安装配置步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Ubuntu使用nginx搭建webdav文件服务器的详细过程

    Ubuntu使用nginx搭建webdav文件服务器的详细过程

    今天通过本文给大家分享Ubuntu使用nginx搭建webdav文件服务器的详细过程,在这小编提示大家在安装nginx时需要先安装nginx-full,具体安装方法跟随小编一起通过本文学习下吧
    2021-05-05

最新评论