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

news2024/11/15 7:55:54

摘要:本文将详细介绍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如何查看当前连接数

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

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

相关文章

Vscode下ESP32工程函数定义无法跳转

1.删除.vscode 2.按下 ctrlshiftp,搜索 ESP-IDF:Add vscode Configuration Folder

SwinIR速读

SwinIR发表在ICCV21,它核心创新在于使用了SwinTransformer(同年ICCV best paper)进行图像修复,由ETH的CVL提出,大组还是抓前沿抓得好,不仅能想到,还能做出来性能,而且性能还是稳定的增益,通用性强。 目前&a…

TCP Window Full TCP Zero Window

TCP window Full & TCP Zero Window 注: 192.168.60.67 是客户端IP10.250.251.223是服务端IP 当客户端向服务发送多个280大小应用层数据时,在No 45帧数据时发生TCP Window Full,应用发送280字节,实际发出去只有67个字节。28…

机器学习——逻辑回归(学习笔记)

目录 一、认识逻辑回归 二、二元逻辑回归(LogisticRegression) 1. 损失函数 2. 正则化 3. 梯度下降 4. 二元回归与多元回归 三、sklearn中的逻辑回归(自查) 1. 分类 2. 参数列表 3. 属性列表 4. 接口列表 四、逻辑回归…

11.面试题——消息队列RabbitMQ

1.RabbitMQ是什么?特点是什么? RabbitMQ是一种开源的消息队列中间件,用于在应用程序之间进行可靠的消息传递。它实现了AMQP(Advanced Message Queuing Protocol)协议,提供了强大的消息处理能力。RabbitMQ的…

DVWA—SQL Injection

DVWA—SQL Injection实例 1. low等级 进入界面后,可以看到它是一个ID的查找内容的输入框,我们输入数字1、2可以看到是从后端返回数据库相应的数据,但是我们作为SQL注入的最终目标是得到更多有关的信息,所以我们需要通过构造payl…

【生成式人工智能-九-大型语言模型的幻觉、偏见等安全性问题】

大型语言模型的安全性 幻觉对语言模型的输出做核查 偏见消除偏见的方法 鉴别是否是人工智能输出prompt hacking 语言模型被骗做事情jailbreakingjailbreaking的危害 prompt injection 今天还是先来谈一下有哪些安全性问题,以及简单介绍有那些应对方案。 幻觉 看过大…

BugKu CTF Misc:

前言 BugKu是一个由乌云知识库(wooyun.org)推出的在线漏洞靶场。乌云知识库是一个致力于收集、整理和分享互联网安全漏洞信息的社区平台。 BugKu旨在提供一个实践和学习网络安全的平台,供安全爱好者和渗透测试人员进行挑战和练习。它包含了…

写一个Vue2和vue3的自定义指令(以复制指定作为示例)

文章目录 一、自定义指令是什么?二、自定义指令有啥用?三、自定义指令怎么用?1.自定义指令的参数2.自定义指令的钩子函数(1)五个钩子函数的说明(2)钩子函数的参数(主要参数:el和valu…

高效管理视频文件,2024年视频压缩软件精选集

我的生活中处处都充满了数据的影子,不知道你是不是也这样。而且存储的数据可能由于某些失误会导致我们数据的丢失,幸运的是,现在我们掌握全免费的数据恢复工具的使用方式,就能尽可能地找回丢失的数据。 1.FOXIT数据恢复 连接直达…

解决客户访问超时1s问题

访问公网地址返回状态码499-CSDN博客 需求描述 客户访问公司公网服务,期望在1s内完成。他们在客户端设置了超时1s的配置,如果超过1s公司服务就会报错499,这是正常的请求返回。 分析问题 目前这个服务通过公网的alb负载均衡到ecs&#xff0…

Stable Diffusion绘画 | 提示词格式

推荐格式 提升画质的提示词与画风的提示词,对整体画面影响较大,建议在首行填写 画质词画风词画面主体描述环境、场景、灯光、构图Lora负面词 画质词 常规画质词: (masterpiece:1.2),best quality,highres,extremely detailed CG,perfect…

集成新的 AI 服务时需要考虑的问题

让我们来谈论最近发生的几个恐怖故事。 去年年底,一家雪佛兰经销商在其主页上部署了一个由大型语言模型 (LLM) 驱动的聊天机器人。该 LLM 经过雪佛兰汽车详细规格的训练,旨在仅回答有关雪佛兰汽车的问题。 然而,用户很快就找到了绕过这些限…

驰骋BPM RunSQL_Init接口SQL注入漏洞复现 [附POC]

文章目录 驰骋BPM RunSQL_Init接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现驰骋BPM RunSQL_Init接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于…

LeetCode 热题 HOT 100 (022/100)【宇宙最简单版】

【技巧】No. 0647 回文子串【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff…

step12:qml程序.exe生成指定图标

文章目录 0.文章内容1.在qt中改变图标效果代码 2. 在生成的build应用程序中改变图标效果代码 3. 获取.ico格式图片的连接参考文档 0.文章内容 1.在qt中改变图标 效果 代码 2. 在生成的build应用程序中改变图标 效果 代码 RC_ICONS logo2.ico 3. 获取.ico格式图片的连接 不…

vue 日期控件 100天内的时间禁用不允许选择

vue 日期控件 100天内的时间禁用不允许选择&#xff0c;可以从101天选起 比如&#xff0c;2024年8月9号开始&#xff0c;100天内禁止选择&#xff0c;第101天之后的日期可以选&#xff0c;效果如图所示 // 日期控件代码 加上 :picker-options"pickerOptions" <…

使用 Vue3 生成二维码和条形码

目录 前言 一、前期准备 1.1. 使用Vite创建工程化项目 1.2 安装所需的依赖 二、环境检查 三、生成二维码 3.1 创建二维码组件 3.2 在App.vue中使用二维码组件 四、生成条形码 4.1 创建条形码组件 4.2.在App.vue中使用条形码组件 五、启动测试与效果演示 5.1 启动de…

【前端可视化】大屏可视化项目三 包含了横向柱形图、竖向柱形图、雷达图、环形图、关系图、数据云图、数据展示图和地图可视化等八个部分

基于vite与tailwindcss创建大屏可视化 项目准备 传统的三列布局 <template><div class"w-full h-full"><div v-if"loading" class"bg-[url(assets/images/bg.png)] bg-cover bg-center loading-container h-screen w-full flex jus…

Arthas简介及示例

一、什么是Arthas&#xff1f; Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方…