Nginx--流量控制

news2024/9/20 13:21:43

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

一、流量限制

1、介绍

流量限制 (rate-limiting);可用来限制用户在给定时间内HTTP请求的数量。请求,可以是一个简单网站首页的GET请求,也可以是登录表单的 POST 请求。流量限制可以用作安全目的

  • 减慢暴力密码破解的速率。
  • 通过将传入请求的速率限制为真实用户的典型值,并标识目标URL地址(通过日志),还可以用来抵御DDOS攻击。
  • 更常见的情况:该功能被用来保护上游应用服务器不被同时太多用户请求所压垮

2、Nginx如何限流

Nginx的”流量限制”使用漏桶算法(leaky bucket algorithm),该算法在通讯和分组交换计算机网络中广泛使用,用以处理带宽有限时的突发情况。就好比,一个桶口在倒水,桶底在漏水的水桶。如果桶口倒水的速率大于桶底的漏水速率,桶里面的水将会溢出;同样,在请求处理方面,水代表来自客户端的请 求,水桶代表根据”先进先出调度算法”(FIFO)等待被处理的请求队列,桶底漏出的水代表离开缓冲区被服务器处理的请求,桶口溢出的水代表被丢弃和不被处理的请求

二、配置基本的限流

1、实验环境

主机名IP地址角色
centos10.0.0.2web服务器
centos-210.0.0.3代理服务器

2、配置文件

流量限制”配置两个主要的指令, limit_req_zonelimit_req ,如下所示:

 #-------------------10.0.0.3代理服务器配置-------------------#
 # 定义一个共享内存区域,用于存储限流状态
 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
 upstream myweb {
   server 10.0.0.2:80 weight=1 max_fails=1 fail_timeout=1;
 }
 server {
   listen 80;
   server_name localhost;
   location /login {
     limit_req zone=mylimit; 
     proxy_pass http://myweb;
     # 发送到上游服务器的HTTP头
     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
 }
 # -------------------10.0.0.2配置---------------------------#
 server {
   listen 80;
   server_name localhost;
   location /login {
     root /usr/share/nginx/html;
     index index.html index.html;
   }
 }

limit_req_zone指令定义了流量限制相关的参数,而limit_req指令在出现的上下文中启用流量限制(示例中,对于”/login/”的所有请求)

limit_req_zone 指令通常在HTTP块中定义,使其可在多个上下文中使用,它需要以下三个参数:

参数说明
key定义应用限制的请求特性
zone定义用于存储每个IP地址状态以及被限制请求URL访问频率的共享内存区域
rate定义最大请求速率

当Nginx需要添加新条目时存储空间不足,将会删除旧条目。如果释放的空间仍不够容纳新记录,Nginx将会返回 503状态码(Service Temporarily Unavailable)另外,为了防止内存被耗尽,Nginx每次创建新条目时,最多删除两条60秒内未使用的条目。

limit_req_zone 指令设置流量限制和共享内存区域的参数,但实际上并不限制请求速率。所以需要通过添加limit_req 指令,将流量限制应用在特定的 location 或者 server 块。在上面示例中,我们对 /login/ 请求进行流量限制。现在每个IP地址被限制为每秒只能请求10次 /login/ ,更准确地说,在前一个请求的100毫秒内不能请求该URL

3、测试访问

当我刷新一次时,正常访问

当访问超过设置的次数时:(本例为方便测试,设置1秒内1次访问)

三、处理突发

如果我们在100毫秒内接收到2个请求,怎么办?对于第二个请求,Nginx将给客户端返回状态码503。这可能并不是我们想要的结果,因为应用本质上趋向于突发性。相反地,我们希望缓冲任何超额的请求,然后及时地处理它们。我们更新下配置,在 limit_req 中使用 burst 参数

 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
 upstream myweb {
   server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1;
 }
 server {
   listen 80;
   server_name localhost;
   location /login {
     limit_req zone=mylimit burst=20;
     proxy_pass http://myweb;
     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
 }

burst 参数定义了超出zone指定速率的情况下,客户端还能发起多少请求。上一个请求100毫秒内到达的请求将会被放入队列,我们将队列大小设置为20;

意味着,如果从一个给定IP地址发送21个请求,Nginx会立即将第一个请求发送到上游服务器群,然后将余下20个请求放在队列中。然后每100毫秒转发一个排队的请求,只有当传入请求使队列中排队的请求数超过20时,Nginx才会向客户端返回503

四、无延迟排队

配置 burst 参数将会使通讯更流畅,但是可能会不太实用,因为该配置会使站点看起来很慢。在上面的示例中,队列中的第20个包需要等待2秒才能被转发,此时返回给客户端的响应可能不再有用。要解决这个情况,可以在 burst 参数后添加 nodelay 参数

 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
 upstream myweb {
   server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1;
 }
 server {
   listen 80;
   server_name localhost;
   location /login {
     limit_req zone=mylimit burst=20 nodelay;
     proxy_pass http://myweb;
     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
 }

使用 nodelay 参数,Nginx仍将根据 burst 参数分配队列中的位置,并应用已配置的速率限制,而不是清理队列中等待转发的请求。相反地,当一个请求到达“太早”时,只要在队列中能分配位置,Nginx将立即转发这个请求。将队列中的该位置标记为”taken”(占据),并且不会被释放以供另一个请求使用,直到一段时间后才会被释放(在这个示例中是,100毫秒后)

如果希望不限制两个请求间允许间隔的情况下实施“流量限制”, nodelay 参数是很实用的;注意: 对于大部分部署,建议使用 burst 和 nodelay 参数来配置 limit_req 指令

五、配置流量控制相关功能

1、配置日志记录

默认情况下,Nginx会在日志中记录由于流量限制而延迟或丢弃的请求,如下所示:

 2023/02/13 04:20:00 [error] 120315#0: *32086 limiting requests, excess: 1.000
 by zone "mylimit", client: 192.168.1.2, server: nginx.com, request: "GET /
 HTTP/1.0", host: "nginx.com"

日志条目中包含的字段:

参数说明
limiting requests表明日志条目记录的是被“流量限制”请求
excess每毫秒超过对应“流量限制”配置的请求数量
zone定义实施“流量限制”的区域
client发起请求的客户端IP地址
server服务器IP地址或主机名
request客户端发起的实际HTTP请求
hostHTTP报头中host的值

默认情况下,Nginx以error级别来记录被拒绝的请求,如上所示(Nginx以较低级别记录延迟请求,一般是info级别);如果要更改Nginx的日志记录级别,需要使用limit_req_log_level指令。下面修改为warn:

 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
 upstream myweb {
   server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1;
 }
 server {
   listen 80;
   server_name localhost;
   location /login {
     limit_req zone=mylimit burst=20 nodelay;
     limit_req_log_level warn;
     proxy_pass http://myweb;
     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
 }

2、发送到客户端到错误代码

一般情况下,客户端超过配置的流量限制时,Nginx响应状态码为503(Service Temporarily Unavailable)可以使用 limit_req_status 指令来设置为其它状态码(例如下面的404状态码):

 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
 upstream myweb {
   server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1;
 }
 server {
   listen 80;
   server_name localhost;
   location /login {
     limit_req zone=mylimit burst=20 nodelay;
     limit_req_log_level warn;
     limit_req_status 404;
     proxy_pass http://myweb;
     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
 }

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Element-UI Table实现列表筛选数据及列表嵌套选择框

VUE 框架在 Element UI 的基础上,Table 组件中实现了列表数据的修改功能,支持单选和多选功能,并且列表具备筛选功能。样式如图所示。 功能介绍 点击table列名实现筛选查询功能相关性判断点击列表中的正方形实现选择框功能,同时修…

设计模式-创建型模式-建造者模式

1.建造者模式定义 建造者模式又称生成器模式,将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示; 1.1 建造者模式优缺点 优点 封装性好,主要的业务员逻辑封装在指挥者类中;客户端不必知道产品内…

RabbitMQ练习(Work Queues)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考:《RabbitMQ练习(Hello World)》 确保RabbitMQ、Sender、Receiver容器正常安装和启动: rootk0test1:~# docker run -it --rm --…

流体中的流线【StreamLines】的实现

流线是一条线,它是 与瞬时速度方向相切(速度是一个矢量,并且 它有一个大小和一个方向)。为了在流程中可视化这一点,我们 可以想象一个小的标记流体元素的运动。例如,我们可以标记一个 用荧光染料滴水&#…

nginx和tomcat负载均衡

文章目录 一,tomcat1.tomca用途2.tomcat重要目录 二,nginx1.Nginx应用2.nginx作用3.nginx的正向代理和反向代理3.1正向代理3.2反向代理(单级)3.3反向代理(多级) 4.nginx负载均衡4.1Nginx支持的常见的分流算法1. 轮询(Round Robin):2.最少连接数(LeastCon…

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变 引言 OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。 至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的,找到了图片识别Excel表格的,有的找图片识别Excel表格的,找到了PDF发票提取表格的,所以就很难搞,还有的说都想要 今天一篇文章,全部搞定所有发票【电子发票&#x…

运维学习————nginx3-keepalived及高可用nginx集群

目录 一、高可用nginx规划图 二、克隆一个nginx 启动测试 ​编辑 三、keepalived简介 四、安装配置keepalived保活nginx 4.1、安装 ​编辑 4.2、配置 4.2.1、主机配置(nginx1(主)配置) 4.2.2、从机配置(nginx2(主)配置)…

敏捷架构框架:数字化转型的核心驱动力

在数字化转型的浪潮中,传统的企业架构和组织结构正面临严峻挑战。为了在快速变化的市场环境中保持竞争力,企业不仅需要灵活的开发流程,还需要一种能够支持敏捷方法的架构体系。《数字化时代的敏捷架构》提出的敏捷架构框架(Agile …

建筑物规则化(实现) --- 特征边分组、重构、直角化

规则化建筑物 一、摘 要 建筑物多边形在地图综合中的两类处理模型:化简与直角化。 建筑物矢量数据来源广泛,在数据获取过程中,受GPS精确度、遥感影像分辨率或人为因素的影响,数据往往存在不同程度的误差。其中,图像分割、深度学习…

规范化JavaBean

Java Bean 是一个很常见的概念,简单来说就是一个 Java 类,其中的内容就是各种属性,以及各个属性的 getter/setter 。例如: class Student {private String name;private int age;public String getName() {return this.name;}pub…

网络协议与Netty

1、讲一讲什么是RPC? 说到RPC就必须要聊一聊单体项目和分布式/微服务项目 单体项目时:一次服务调用发生在同一台机器上的 同一个进程内部 ,也就是说调用发生在本机内部,因此也被叫作本地方法调用。 分布式/微服务项目时&#x…

负载均衡:定义与核心作用

负载均衡:定义与核心作用 一、负载均衡的定义二、负载均衡的核心作用 💖The Begin💖点点关注,收藏不迷路💖 负载均衡,作为网络技术的重要一环,对优化资源利用和提升服务器响应速度至关重要。本文…

Ps:首选项 - 界面

Ps菜单:编辑/首选项 Edit/Preferences 快捷键:Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为,从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率,减轻眼…

快速带你玩转高性能web服务器

目录 一.Web 服务基础介绍 ​编辑1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache的图标 1.2.2 NGINX的图标: 1.2.3 Apache 经典的 Web 服务端 1.2.3.1 Apache prefork 模型 1.2.3.2 Apache worker 模型 1.2.3.3 Apache event模型 1.2.4 Nginx-高性能的 Web …

PanDownload 网页复刻版最新PHP源码

源码介绍 PanDownload 网页复刻版,PHP语言版,PanDownload在线解析下载的优点,速度快,受用户自身带宽限制,就是说你的宽度交多少决定你下载的速度,不用下载百度网盘客户端,你可以直接使用解析所…

PingCAP 携手 CCF 数据库专委会打造“开源数据库领域拔尖创新人才培育计划”,共塑数据库教育未来丨NDBC 2024

2024 年 8 月 7 日 - 10 日,由中国计算机学会主办、中国计算机学会数据库专业委员会和新疆大学承办、新疆 IT 三会等单位协办的第 41 届中国数据库学术会议(NDBC 2024)在新疆乌鲁木齐成功举办。 大会上 PingCAP 联合创始人黄东旭发表了主题演…

LabVIEW深度监测系统

随着果园机械化作业的迅速发展,传统的人工监测方式已难以满足现代农业的高效率与精准性需求。本文介绍了一种基于LabVIEW软件的果园开沟深度监测系统,该系统通过集成先进的传感技术与数据处理算法,实现了对开沟深度的实时精确监测和自动控制&…

11.SPI通信

SPI理论 常规四线:SCLK、CS、MOSI(主向从发)、MISO(从向主发) 同步、串行、全双工、速率(MHz) 一主一从、一主多从、不能多主 工作模式: CPOL 0:总线空闲状态时钟为低电平,1:总线空闲状态时钟为高电平 CPHA 0&#…

【Python系列】执行 Shell 命令的六种方法

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…