一,limit_req的用途:

1,官方文档地址:

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

2,用途:

限制用户在给定时间内HTTP请求的数量,

流量限制主要用作安全目的,

可以防止大量请求的攻击下服务被压垮,

可以减慢暴力密码破解的速率

3,原理:漏桶算法

在limit_req的限制下,请求被nginx以固定的速率处理,这个符合漏桶算法,

即流出的速率恒定。

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,limit_req的配置举例:

1,常用的两个指令:

nginx.conf中

limit_req_zone:定义到http区域:

 limit_req_zone $binary_remote_addr zone=perip:20m rate=1r/s;

limit_req:定义到server或location区域

limit_req zone=perip;

说明:

变量:$binary_remote_addr,这里是客户端的ip地址,

在这里是做限制的标识,是基于ip地址来限制

zone=perip:20m:  perip是内存区域的名字,

20m: 生成的内存区域的大小

rate=1r/s:       允放相同标识的客户端的访问频次,

在这个例子中:就是同一个ip地址在每秒内只能访问1次

2,例子一:以每秒处理1个请求的速率做限制

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
...
limit_req zone=perip;

重启 nginx后测试:

[liuhongdi@centos8 logs]$ ab -c 10 -n 10 http://www.lhdtest.com/index.html
...
Concurrency Level: 10
Time taken for tests: 0.002 seconds
Complete requests: 10
Failed requests: 9
(Connect: 0, Receive: 0, Length: 9, Exceptions: 0)
Non-2xx responses: 9
...

只有一个成功,有9个请求失败

时长是0.002 seconds

3,例子2:burst

增加burst,再次测试

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
...
limit_req zone=perip burst=2;

说明:burst=2 允许2个突发,

有大量请求时,超过频次限制的请求,会允许2个访问,

注意:burst指定的请求数量,不会马上进行处理,

而是按照rate指定的值,以固定的速率进行处理。

以10个并发请求为例:

rate= 1r/s

就是先处理1个,剩下的9个中,

7个请求,直接返回503

剩下的2个放到突发的队列中延迟执行,

仍然按rate= 1r/s进行处理,所以需要约两秒的等待时间

[liuhongdi@centos8 logs]$ ab -c 10 -n 10 http://www.lhdtest.com/index.html
...
Concurrency Level: 10
Time taken for tests: 2.004 seconds
Complete requests: 10
Failed requests: 7
(Connect: 0, Receive: 0, Length: 7, Exceptions: 0)
Non-2xx responses: 7
...

有7个请求失败

注意时间变成了2.004 seconds

4,例子三:nodelay

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
...
limit_req zone=perip burst=2 nodelay;

说明:

nodelay参数:

burst的队列虽然可以处理用户的需求,但需要用户按照处理时间等待,对用户不够友好,

nodelay参数允许请求在排队的时候就立即被处理,

这里有一点要注意:因为nodelay允许立即处理,也就是有并发请求时

事实上已经超过了rate设置的处理速率了,

所以要根据自己机器的实际情况设置这个值

理解nodelay:

nodelay只是对放到burst队列中的请求立即处理,

但处理完成后队列并不立即清空,

队列清空的速度仍然按原来的速度每秒一个清空,

所以当再有请求过来时,并不会马上又有两个burst请求被处理.

再次测试

[liuhongdi@centos8 logs]$ ab -c 10 -n 10 http://www.lhdtest.com/index.html
...
Concurrency Level: 10
Time taken for tests: 0.002 seconds
Complete requests: 10
Failed requests: 7
(Connect: 0, Receive: 0, Length: 7, Exceptions: 0)
Non-2xx responses: 7
...

有7个请求失败

注意时间:这次是0.002 seconds

三,rate和burst应该设置为多少?

1,网站需要把动态生成的内容(java,php,python等程序生成)和静态内容分离到不同的虚拟主机

因为静态内容不需要大量的计算,

通常limit_req用于限制动态内容的访问频率

2,限流的目的不是让用户不能访问,

而是为了保证用户能流畅的访问,

所以需要根据页面的实际情况来限制

如果一个页面打开时同时发出的请求比较多,

(静态文件分离后要检查ajax请求数,

可以根据生产环境的日志进行检查)

则rate值不能低于并发的请求数.

如果低于并发的情求数,会导致用户不能正常访问页面

3,我们在生产环境中的例子,仅供参考

     limit_req_zone $binary_remote_addr zone=reqperip:20m rate=20r/s;
limit_req zone=reqperip burst=10 nodelay;

四,其他可配置的参数:

1,limit_req_status用来指定请求时报错产生的状态码:

limit_req_status 这个值默认是503,

可以指定为一个自定义的值,

例如:444

说明:444是nginx自定义的一个非标准状态码,

它会立即关闭连接,连响应头也不给客户端发

可以在受到恶意攻击时使用这个状态码

2,limit_req_log_level   当报错时记录到日志的错误级别,

默认值是error

可选值: info | notice | warn | error

不建议改动这个值

 

五,查看nginx的版本:

[root@centos8 conf.d]# /usr/local/soft/nginx-1.18.0/sbin/nginx -v
nginx version: nginx/1.18.0

nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)的更多相关文章

  1. nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

    nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...

  2. nginx与apache 对比 apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

    nginx与apache详细性能对比 http://m.blog.csdn.net/lengzijian/article/details/7699444 http://www.cnblogs.com/ ...

  3. nginx反向代理时保持长连接

    ·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟. 如果我们使用了nginx去作为 ...

  4. Nginx解析漏洞复现以及哥斯拉连接Webshell实践

    Nginx解析漏洞复现以及哥斯拉连接Webshell实践 目录 1. 环境 2. 过程 2.1 vulhub镜像拉取 2.2 漏洞利用 2.3 webshell上传 2.4 哥斯拉Webshell连接 ...

  5. 死磕nginx系列--nginx 限流配置

    限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...

  6. 限流(四)nginx接入层限流

    一.nginx限流模块 接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等. nginx中针对限流有两个模块可以处理: 1)ngx_http_limit_req_mod ...

  7. Nginx限流

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发.这个时候接口进行限流是非常有必要的,而限流是Ngin ...

  8. 利用 Nginx 实现限流

    在当下互联网高并发时代中,项目往往会遇到需要限制客户端连接的需求.我们熟知的 Nginx 就提供了有这样的功能,可以简单的实现对客户端请求频率,并发连接和传输速度的限制…. Nginx 限流 Ngin ...

  9. 【高并发】面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!

    写在前面 最近,有不少读者说看了我的文章后,学到了很多知识,其实我本人听到后是非常开心的,自己写的东西能够为大家带来帮助,确实是一件值得高兴的事情.最近,也有不少小伙伴,看了我的文章后,顺利拿到了大厂 ...

随机推荐

  1. Robotframework自动化2-Windows环境搭建

    前言 上节主要介绍了部分的robotframework搭建,如果想运行APP的话,还需要进一步配置环境. 需要安装的软件 1.Android-sdk-windows 2.JDK 3.Appium-de ...

  2. [Spark快速大数据分析]阅读笔记

    第2章 Spark分布式执行涉及的组件 每个Spark应用都由一个驱动程序来发起集群上的各种并行操作,驱动程序通过一个SparkContext对象访问Spark:驱动程序管理多个执行器节点,可以用Sp ...

  3. 《Java核心技术卷一》之 泛型

    一.引言 在学习集合的时候我们会发现一个问题,将一个对象丢到集合中后,集合并不记住对象的类型,统统都当做Object处理,这样我们取出来再使用时就得强制转换类型,导致代码臃肿,而且加入集合时都是以Ob ...

  4. php第二天-函数的用法及封装,变量范围,匿名函数,递归函数

    1.函数 <?php function test($info){ return $info; } echo test("hello") ?> 输出hello 2.函数实 ...

  5. Aop的学习与使用

    什么是aop AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一 ...

  6. java 并发线程池的理解和使用

    一.为什么要用线程池 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立 ...

  7. 转载:Win7系统 利用 pycharm导入Tensorflow失败,出现报错——ImportError:DLL load failed with error code -1073741795的解决方式

    转载自:https://blog.csdn.net/shen123me/article/details/80621103 下面的报错信息困扰了一天,网上的各种方法也都试过了,还是失败,最后自己瞎试,把 ...

  8. Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案

    一. 前言 在上一篇文章介绍 youlai-mall 项目中,通过整合Spring Cloud Gateway.Spring Security OAuth2.JWT等技术实现了微服务下统一认证授权平台 ...

  9. 智慧矿山-选矿工艺数字 3D 可视化

    前言 现代科技和工业的发展对矿物原料的要求越来越高,直接开采的原矿石往往达不到标准,而原矿通过选矿加工后则可以满足要求.选矿技术在冶金.煤炭.化工.建材和环保等部门都得到应用,对国民经济的发展意义重大 ...

  10. Ribbon自定义负载均衡策略,在网关实现类似Ip_hash的负载均衡,ribbon给单个服务配置属性

    背景: 我需要在网关实现一种功能,某个用户的请求永远打在后台指定的服务,也就是根据ip地址进行负载均衡 原理: 在ribbon的配置类下: 那我们自己创建一个IRule的实现类,模仿ZoneAvoid ...