nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)
一,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限制连接速率(流量控制/限流)的更多相关文章
- nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...
- nginx与apache 对比 apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx与apache详细性能对比 http://m.blog.csdn.net/lengzijian/article/details/7699444 http://www.cnblogs.com/ ...
- nginx反向代理时保持长连接
·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟. 如果我们使用了nginx去作为 ...
- Nginx解析漏洞复现以及哥斯拉连接Webshell实践
Nginx解析漏洞复现以及哥斯拉连接Webshell实践 目录 1. 环境 2. 过程 2.1 vulhub镜像拉取 2.2 漏洞利用 2.3 webshell上传 2.4 哥斯拉Webshell连接 ...
- 死磕nginx系列--nginx 限流配置
限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...
- 限流(四)nginx接入层限流
一.nginx限流模块 接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等. nginx中针对限流有两个模块可以处理: 1)ngx_http_limit_req_mod ...
- Nginx限流
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发.这个时候接口进行限流是非常有必要的,而限流是Ngin ...
- 利用 Nginx 实现限流
在当下互联网高并发时代中,项目往往会遇到需要限制客户端连接的需求.我们熟知的 Nginx 就提供了有这样的功能,可以简单的实现对客户端请求频率,并发连接和传输速度的限制…. Nginx 限流 Ngin ...
- 【高并发】面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!
写在前面 最近,有不少读者说看了我的文章后,学到了很多知识,其实我本人听到后是非常开心的,自己写的东西能够为大家带来帮助,确实是一件值得高兴的事情.最近,也有不少小伙伴,看了我的文章后,顺利拿到了大厂 ...
随机推荐
- numpy函数笔记(持续更新)
numpy函数笔记 np.isin用法 np.isin(a,b) 用于判定a中的元素在b中是否出现过,如果出现过返回True,否则返回False,最终结果为一个形状和a一模一样的数组.(注意:这里的a ...
- python守护线程t.setDaemon(True)
守护线程是守护主线程 t.setDaemon(True),调用函数里面存在等待时间时,只要设置了守护线程,函数中等待时间下面的代码都不会再执行
- EasyCode插件使用及模板参考
EasyCode插件使用及模板参考 1.介绍安装 Easycode是idea的一个插件,可以直接对数据的表生成entity.controller.service.dao.mapper无需任何编码,简单 ...
- Windows提示80被占用
情景:使用cmd启动某一服务的时候报错[emerg] 7220#6900: bind() to 0.0.0.0:80 failed (10013: An attempt was made to acc ...
- Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站(6)
前言 在之前已经写了关于Git,Gitlab以及Ansible的两篇博客<Git+Gitlab+Ansible剧本实现一键部署Nginx–技术流ken>,<Git+Gitlab+An ...
- Java高级开发必会的50个性能优化的细节(珍藏版)
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. ● 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短 ...
- HTTP协议学习之Request学习
在开始前,我们首先对HTTP协议做个简单的了解 HTTP协议(Hyper Text Transfer Protocol) 超文本传输协议 名词非常的高大上,如果学过计算机网络这门课(再如果还有一点印象 ...
- Windows下设置Mongodb用户名密码
MongoDB认证: 在默认的情况下,Mongodb是监听在127.0.0.1 IP上的,端口号默认为27017,任何客户端都可以连接,不需要认证 默认情况下,Mongodb也是没有管理账户的,除非你 ...
- Kafka消费与心跳机制
1.概述 最近有同学咨询Kafka的消费和心跳机制,今天笔者将通过这篇博客来逐一介绍这些内容. 2.内容 2.1 Kafka消费 首先,我们来看看消费.Kafka提供了非常简单的消费API,使用者只需 ...
- linux 基础语法
1.linux常用命令 1.1 系统命令 runlevel # 查看当前的运行级别systemctl status sshd # 开启网络服务功能 ...