当前位置: 首页 > 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协议,感觉…...

SQL Zoo 8.Using Null

以下数据均来自SQL Zoo 1.List the teachers who have NULL for their department.&#xff08;列出所属部门为NULL的教师&#xff09; select name from teacher where dept is null 2.Note the INNER JOIN misses the teachers with no department and the departments wit…...

LeetCode274. H 指数

题目链接&#xff1a; 274. H 指数 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a;这个题目可以使用哈希表来以空间换时间&#xff0c;我们设置一个数组v来统计每一个对应的影响因子的文章出现的数量&#xff0c;遍历一遍后&#xff0c;v[i]表示影响因子为i的…...

概述:Dubbo、Nacos、 Zookeeper 等分布式服务协调与治理等技术

目录 1. Dubbo 2. Nacos 3. Zookeeper Dubbo、Nacos、Zookeeper 是分布式服务协调与治理领域中的关键技术&#xff0c;它们在微服务架构和分布式系统中扮演着重要角色。以下是对这些技术的详细介绍&#xff1a; 1. Dubbo 概述&#xff1a; Dubbo 是一个高性能、轻量级的开…...

【LINUX】小工具降耦合,全内核函数插入宏摸索测试中。。

这阵子把这个小工具对外的耦合度降了下&#xff0c; include/linux/printk_self.h r77683962/linux-6.9.0 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/blob/master/include/linux/printk_self.h 这个用于初始化打印日志的级别和打印次数&#xff1a; void Param…...

24/8/12算法笔记 复习_线性回归

import numpy as np#导入包 X np.array([[1,1],[2,1]])#构造矩阵 y np.array([14,10])np.linalg.solve(X,y) #linalg是线性代数&#xff0c;用于求解线性方程AX b,solve计算线性代数回归问题X.T#转置 a X.T.dot(X)#矩阵乘法B np.linalg.inv(a)#求逆矩阵from sklearn.linea…...

Linux系统驱动(十四)输入子系统

文章目录 一、输入子系统&#xff08;一&#xff09;输入子系统框架结构&#xff08;二&#xff09;输入子系统的API 二、实现两个按键的驱动&#xff08;一&#xff09;实现思路&#xff08;二&#xff09;代码实现 一、输入子系统 在linux系统中使用输入子系统驱动上报鼠标&…...

力扣(2024.08.12)

1. 98&#xff1a;验证二叉搜索树 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def isValidBST(self, r…...

最新版的AutoGPT,我搭建好了

最近AutoGPT不是更新了嘛 安装 我按照官方的教程 在本地搭建好了 改动 可见的改动&#xff0c;主要是把原来的纯命令行改成前后端的形式 看下前端界面 界面比较简单&#xff0c;主要分3个大块 监控 第一个是监控 主要是看你在 build 里构建的Agents的运行情况 build 第一个是Ag…...

[SWPUCTF 2021 新生赛]PseudoProtocols(构造伪协议)

打开题目所给的环境我们可以看到这样一句话&#xff1a; 这里我先尝试访问/hint.php &#xff0c;但是发现什么都没有发生&#xff0c; F12查看源代码也并没有发现什么&#xff0c;到这里来看的话似乎没有思路了&#xff0c;但是这个题的题目已经给了我们很明显的提示&#xff…...

基于STM32开发的智能语音助手系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 智能家居控制个人语音助理常见问题及解决方案 常见问题解决方案结论 1. 引言 随着人工智能技术的发展&#xff0c;智能语音助手已经逐渐进入了人们的日常生活。…...