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

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...