当前位置: 首页 > news >正文

深入解析Nginx限流策略:如何高效控制访问频率

摘要:本文将详细介绍Nginx限流模块的使用方法,包括基于IP地址的限流、基于并发连接的限流以及如何应对突发流量。通过实际案例,帮助读者掌握Nginx限流策略,确保服务器在高并发场景下的稳定运行。

一、引言

在高并发场景下,服务器资源有限,为防止恶意访问或突发流量导致服务器过载,需要对访问频率进行限制。Nginx作为一款高性能的Web服务器,提供了丰富的限流模块,可以帮助我们实现这一需求。本文将重点介绍Nginx限流模块的使用方法。

二、Nginx速率限流

Nginx使用 ngx_http_limit_req_module 模块进行限流,基于漏桶算法原理实现。主要包括以下三个指令:

  • limit_req_zone:定义限流区域,用于存储客户端请求的计数信息。
  • limit_req:限制每个请求的处理速率。
  • limit_req_status:设置限流时返回给客户端的错误状态码。

定义限流空间

语法:limit_req_zone key zone rate

  • key:定义限流对象,如binary_remote_addr表示基于remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。
  • zone:定义共享内存区来存储请求计数信息, ipRateLimit:10m 表示创建一个名字为ipRateLimit,大小为10M的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
  • rate:用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求

案例:

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

这里,$binary_remote_addr表示客户端IP地址,zone=ipRateLimit:10m表示创建一个名为ipRateLimit的共享内存区域,大小为10MB,rate=1r/s表示每秒最多处理10个请求。

应用限流规则

我们需要先配置限流缓存空间,然后在对应请求的location段下面添加以下配置:

语法:

limit_req zone=ipRateLimit burst=5 nodelay;
limit_req_status 429;
  • zone=ipRateLimit:指定一个共享内存区域,需要在http段或server段中先定义这个区域
  • burst=5:设置一个缓冲区大小,允许短时间内超过限制的请求数量。在这个例子中,缓冲区大小为5,意味着如果客户端在短时间内发送了超过限制的请求,Nginx会允许最多5个请求进入缓冲区等待处理。
  • nodelay:当启用这个参数时,Nginx会立即处理缓冲区中的请求,而不是按照配置的速率(rate)延迟处理。如果不使用nodelay,即使缓冲区中有请求,Nginx也会按照配置的速率来处理请求。
  • limit_req_status:设置返回给客户端的错误状态码

这里,zone=ipRateLimit指定使用前面定义的限流区域,burst=5表示允许短时间内超过限制的请求数量为5个,nodelay表示立即处理超出限制的请求。如果请求超出了限制,Nginx将返回429状态码(Too Many Requests)

实战配置

http {  # 定义限流区域配置limit_req_zone $binary_remote_addr zone=one:10m rate=10/s;  server {  listen 80;  server_name www.changai.online;  root /opt/software/run/web/dist;  index index.html;  location / {  # 应用限流规则limit_req zone=one burst=20 nodelay; limit_req_status 429;proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header REMOTE-HOST $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }   }  
}

重启启动nginx,频繁访问具有限流配置的请求。

在这里插入图片描述

error重定向

在Nginx中,当使用limit_req模块进行请求速率限制,并且请求超出了设定的速率限制时,默认情况下Nginx会返回503 Service Temporarily Unavailable错误。如果你想要在这种情况下返回指定的页面(比如一个友好的错误页面),你可以通过error_page指令来实现,通过error_page指令来捕获503错误,并将其重定向到你指定的页面。

http {  # ... 其他http块配置 ...  # 定义请求限制区域  limit_req_zone $binary_remote_addr zone=ipRateLimit:10m rate=10r/s;  server {  listen       80;  server_name  localhost;  # 定义错误页面位置  error_page 503 @limit_error;  # 请求速率限制  limit_req zone=ipRateLimit burst=10 nodelay;  # 其他server块配置...  # 捕获503错误并返回指定页面  location @limit_error {  # 指定错误页面的路径,这里假设你的错误页面是/error/503.html  root /path/to/your/error/pages;  try_files /error/503.html =503;  }  location / {  # ... 其他location块配置 ...  }  # ... 其他location块 ...  }  # ... 其他server块或http块配置 ...  
}

在这个配置中,当请求因为超出ipRateLimit区域的速率限制而被Nginx拒绝时,Nginx会返回503错误。由于我们在server块中设置了error_page 503 @limit_error;,所以Nginx会捕获这个503错误,并将请求内部重定向到名为@limit_error的location块。在这个location块中,我们指定了错误页面的路径,并通过try_files指令尝试直接服务该页面。如果找不到该页面,则Nginx会再次返回503错误(但通常你已经提供了页面,所以这种情况不会发生)。

请注意,你需要将/path/to/your/error/pages替换为你的错误页面实际所在的目录路径,并将/error/503.html替换为你想要返回的具体错误页面文件名。

效果:
在这里插入图片描述

参数详解

1. burst参数作用?

burst参数在Nginx的limit_req模块中非常有用,它为处理突发流量提供了一个缓冲区,当请求以不超过rate定义的速率到达时,Nginx会按照配置的速率处理请求,此时burst不起作用。当请求速率超过rate时,超出的请求会被放入一个队列中,这个队列的大小由burst定义。如果队列已满,额外的请求将被延迟处理或直接丢弃,这取决于是否配置了nodelay参数。
我们需要配置burst来应对一些正常的请求突发情况,对于超出rate速率的请求,如果超出部分请求在burst配置范围内则会被立即处理,但这些请求属于是特殊处理,即使后续又来了请求且在rate速率内也不会马上处理,需要将burst额外占用的请求补上才能处理后续的请求。这既可以解决正常用户的访问,也能避免服务器受到攻击。

2. burst设置多少合适?

burst的大小应小于等于最大预期突发流量:如果你预期会有突发流量,burst的大小应该设置得足够大,以处理这些突发请求,但不应过大,以免影响服务器的稳定性。
rate与burst的比例:通常,rate应该设置得足够低,以确保服务器不会因为请求处理而超载,而burst则应该设置得足够高,以处理正常的突发流量。burst的大小通常是rate的几倍,具体数值取决于应用程序的具体需求和服务器的能力。
处理延迟:如果burst设置得过大,而rate保持不变,那么在处理完burst中的所有请求后,后续请求可能会经历较长的等待时间,因为Nginx会按照rate的速率逐个处理队列中的请求。

2. nodelay参数作用

当启用这个参数时,Nginx会立即处理缓冲区中的请求,而不是按照配置的速率(rate)延迟处理。如果没有使用nodelay参数,Nginx默认会延迟处理超出rate和burst定义的请求数量。这意味着超出部分的请求不会立即被丢弃,而是会被放入队列中,Nginx会按照配置的速率(rate)逐个处理队列中的请求。
如果你使用了nodelay参数,Nginx会立即处理所有在burst大小内的请求,而不会按照rate定义的速率进行延迟。这意味着在burst允许的额外请求数量内,请求会尽可能快地被处理
总结来说,Nginx默认的行为是延迟处理超出rate和burst的请求,除非你使用了nodelay参数或者请求量非常大导致队列溢出,这时超出的请求可能会被丢弃。

三、Nginx连接限流

在Web服务器的高并发场景中,除了限制请求速率外,限制并发连接数也是保护服务器资源的一个重要手段。Nginx的ngx_http_limit_conn_module模块正是为了满足这一需求而设计的。本文将带你了解如何使用这个模块来设置连接限制。

定义限流区域

首先,在Nginx配置文件的http段中定义一个限流区域:

limit_conn_zone $binary_remote_addr zone=connLimitZone:10m;

这里,$binary_remote_addr是客户端IP地址的变量,zone=connLimitZone:10m定义了一个名为connLimitZone的共享内存区域,大小为10MB。

应用限流规则

接下来,在server或location块中应用连接限制:

limit_conn connLimitZone 10;

这个配置表示,对于每个客户端IP,最多允许10个并发连接。

处理超出连接

当客户端的并发连接数超过限制时,Nginx默认的行为是拒绝新的连接。我们可以通过日志记录超出限制的连接,以便于后续分析。

limit_conn_log_level error;
limit_conn_status 503;

这里,limit_conn_log_level设置记录日志的级别,limit_conn_status设置返回给客户端的错误状态码(503表示服务不可用)。

实战配置

http {limit_conn_zone $binary_remote_addr zone=connLimitZone:10m;server {location /download/ {limit_conn connLimitZone 5;limit_conn_log_level warn;limit_conn_status 503;# 其他location配置...}}
}

通过使用ngx_http_limit_conn_module模块,我们可以有效地限制客户端的并发连接数,从而保护服务器免受过多并发连接的影响。合理配置这个模块对于确保服务器在高并发环境下的稳定运行至关重要。在配置时,应根据服务器的实际能力和业务需求来设置合适的连接数限制。

当前连接查看请参考文章:Nginx如何查看当前连接数

相关文章:

深入解析Nginx限流策略:如何高效控制访问频率

摘要:本文将详细介绍Nginx限流模块的使用方法,包括基于IP地址的限流、基于并发连接的限流以及如何应对突发流量。通过实际案例,帮助读者掌握Nginx限流策略,确保服务器在高并发场景下的稳定运行。 一、引言 在高并发场景下&#x…...

锂电池剩余寿命预测 | Matlab基于Transformer-GRU的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer-GRU的锂电池剩余寿命预测,Transformer结合门控循环单元。 Matlab基于Transformer-GRU的锂电池剩余寿命预测(单变量) 运行环境Matlab2023b及以上。 首先从…...

深入理解Spring的IOC容器与依赖注入

深入理解Spring的IOC容器与依赖注入 引言 Spring框架的核心功能之一就是它的IOC容器,它为开发人员提供了强大的依赖管理和控制反转的能力。本文将详细介绍Spring的IOC容器以及依赖注入的基本概念和实现方式,并通过示例展示如何在实际项目中应用这些技术…...

Qt读写sysfs

本文介绍Qt读写sysfs。 在嵌入式Linux系统上开发Qt应用程序,经常会涉及到外设的控制,比如GPIO,PWM的控制,Linux环境下可以像操作文件一样操作它们,这通常会涉及到sysfs的读写。本文以读写GPIO为例,简要介绍…...

实景三维:解锁地理信息新维度,引领未来城市智慧之钥

在这个信息爆炸与科技日新月异的时代,地理信息与遥感技术正以前所未有的速度改变我们认知世界的方式。在推动“实景三维平台”这一前沿科技的构建上,它不仅是地理信息的立体呈现,更是智慧城市的基石,打开了通往未来城市规划、管理…...

汽车免拆诊断案例 | 2010款劳斯莱斯古斯特车中央信息显示屏提示传动系统故障

故障现象  一辆2010款劳斯莱斯古斯特车,搭载N74发动机,累计行驶里程约为11万km。车主反映,起动发动机后组合仪表和中央信息显示屏均提示传动系统故障。用故障检测仪检测,发现发动机控制模块2(DME2)中存储…...

监督学习和无监督学习是什么?

监督学习和无监督学习是机器学习中的两种基本学习方式,它们在处理数据和训练模型时有着显著的区别。 监督学习 定义: 监督学习是指利用一组已知类别的样本(即标记的数据)来调整分类器的参数,使其达到所要求性能的过程…...

YII2的errorHandler.errorAction失效原因

<?phpreturn [components => [errorHandler => [errorAction => site/error,],] ]; 这段配置存在错误,导致错误处理无法生效。为了解决这个问题,我们需要对配置进行优化。 代码查看:yii\web\ErrorHandler::renderException <?phpprotected function ren…...

已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。

#include<assert.h> typedef struct SLnode {int data;struct SLnode* prior;struct SLnode* next; }SLnode,*SLnodelist; //创建结点 SLnode* createhead(int data) {SLnode* newnode (SLnode*)malloc(sizeof(SLnode));newnode->data data;newnode->next newno…...

什么是Tensor???为什么人工智能领域论文中经常出现这个名词

文章目录 什么是Tensor&#xff1f;&#xff1f;数学符号表示 什么是Tensor&#xff1f;&#xff1f; Tensor&#xff0c;中文叫张量。Tensor实际上就是一个多维数组&#xff08;multidimensional array&#xff09;。 而Tensor的目的是能够创造更高维度的矩阵、向量。 数学符…...

爬虫练习_01

前言 基础爬虫小练习01 一、requests板块使用 demo_01 import requests from lxml import etreeurl "https://movie.douban.com/top250" headers {"authority": "movie.douban.com","method": "GET","path"…...

Datawhale X 魔搭 AI夏令营第四期 魔搭-AIGC方向 task02笔记

从零入门AI生图原理&实践 是 Datawhale 2024 年 AI 夏令营第四期的学习活动&#xff08;“AIGC”方向&#xff09;&#xff0c;基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展的实践学习。 Datawhale官方的Task2链接&#xff1a;Task02 往期Task1链接&#xff1a;Ta…...

多模态大语言模型的免训练视觉提示学习 ControlMLLM

ControlMLLM: Training-Free Visual Prompt Learning for Multimodal Large Language Models github paper 在本研究中&#xff0c;提出了一种无需进行训练的方法&#xff0c;通过可学习的潜变量优化将视觉提示注入到多模态大型语言模型&#xff08;MLLMs&#xff09;中。 在…...

Oracle|DM 常用|不常用 SQL大口袋

目录 一、前言 二、SQL写法 1、sql获取某一条数据中的前一条和后一条 2、实现like多个值的查询&#xff08;Oracle和dm支持&#xff0c;MySQL未试过&#xff09; 3、start with connect by prior 使用方法 4、用hextoraw解决select、update、delete语句执行慢 5、ORA-00…...

嵌入式软件--模电基础 DAY 1

C语言的学习告一段落了&#xff0c;要多多注意复习回顾&#xff0c;温故而知新&#xff0c;学习的过程就是与遗忘作斗争。接下来就是嵌入式学习中硬件电路方面的知识了。 一、电学基础 1.电流 电流&#xff08;Current&#xff09;是电荷在单位时间内通过导体横截面的流动量…...

【Nacos无压力源码领读】(二) 集成 LoadBalancer 与 OpenFeign

上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的; 本文承上启下, 在订阅服务实例的基础上, 介绍如…...

《投资的原理》阅读笔记二——价值投资真是王者吗?

《投资的原理》的第二章是《史记货殖列传里的八大投资金句》&#xff0c;作者在这一章里宣扬的主要观点是价值投资才是稳妥的投资之路。但我觉得作者讲述的很多例子&#xff0c;包括经典的“两个金条放在一起&#xff0c;你告诉我那根是高尚的”&#xff0c;更多的应该体现在“…...

SSH、FTP、SFTP相关协议详解

一、SSH 1、定义 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录到另一台计算机上&#xff0c;并执行命令或程序。SSH由IETF的网络小组&#xff08;Network Working Group&#xff09;所制定&#xff0c;是建立在应用层基础上的安全…...

C语言进阶——一文带你深度了解“C语言关键字”(中篇6)

本篇文章记录我学习C语言进阶知识——C语言关键字&#xff0c;旨在记录分享&#xff0c;希望我的分享能带给你不一样的收获&#xff01; 目录 一、return关键字 二、const 关键字也许该被替换为 readolny &#xff08;一&#xff09;、 const 修饰的只读变量 &#xff08;二…...

自建极简Ethercat主站-第8章 FOE基础功能实现

文章目录 第8章 FOE8.1 FOE简介8.2 FOE 数据结构8.2.1 FOE帧格式8.2.2 FOE请求8.3 数据传输流程8.3.1 读流程8.3.2 写流程8.3.3 忙操作8.3.4 代码示例第8章 FOE 源码地址 8.1 FOE简介 ​ FOE(File Access over Ethercat),用于节点之间的文件传输。协议类似于TFTP协议,感觉…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...