Nginx 限流功能:原理、配置与应用
Nginx 限流功能:原理、配置与应用
在当今互联网应用的高并发场景下,服务器面临着巨大的压力。为了确保系统的稳定运行,保障核心业务的正常开展,限流成为了一项至关重要的技术手段。Nginx 作为一款高性能的 Web 服务器和反向代理服务器,其强大的限流功能为我们应对高并发挑战提供了有力支持。本文将深入探讨 Nginx 限流功能的原理、配置方法以及实际应用场景,同时解答关于 4 层代理能否限制速率的疑问。
一、Nginx 限流的概念与作用
限流,简单来说,就是对系统的请求流量进行控制,限制单位时间内进入系统的请求数量。当系统面临突发的大量请求时,如果不加以限制,可能会导致服务器资源耗尽,进而引发系统崩溃,影响所有用户的正常使用。Nginx 限流功能可以有效地保护后端服务器,避免因过载而出现故障,同时还能保证关键业务的服务质量。例如,在电商平台的促销活动中,通过限流可以防止瞬间大量的抢购请求压垮服务器,确保每个用户都能得到公平且稳定的服务。
二、Nginx 限流的实现方式
Nginx 主要通过两个模块来实现限流功能:ngx_http_limit_req_module和ngx_http_limit_conn_module。
(一)ngx_http_limit_req_module
该模块基于漏桶算法(Leaky Bucket Algorithm)来实现限流。漏桶算法的原理就像一个底部有小孔的水桶,无论水流速度如何变化,水桶都会以固定的速率向外漏水。当请求进入系统时,就如同水流进入水桶,如果请求的速度超过了系统处理的速度(即水桶漏水的速度),多余的请求就会被暂存起来(存放在水桶中),当水桶满了之后,新的请求就会被丢弃。在 Nginx 中,ngx_http_limit_req_module通过限制请求的速率来达到限流的目的。
(二)ngx_http_limit_conn_module
ngx_http_limit_conn_module模块则是基于连接数来进行限流。它主要用于限制同一时间与服务器建立的连接数。例如,在一个在线游戏服务器中,为了保证每个玩家都能获得流畅的游戏体验,需要限制同时在线的玩家数量,这时就可以使用ngx_http_limit_conn_module模块来限制每个 IP 或每个虚拟主机与服务器建立的连接数。当连接数达到限制值时,新的连接请求将被拒绝。
三、Nginx 限流配置详解
(一)ngx_http_limit_req_module 配置示例
定义限流区域
首先,在 Nginx 的配置文件中,需要定义一个限流区域。例如,我们要限制每个 IP 地址每秒最多只能发起 2 个请求,可以这样配置:
http {limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;}
这里,$binary_remote_addr表示使用客户端的 IP 地址作为限流的依据;zone=mylimit:10m定义了一个名为mylimit的限流区域,并且分配了 10MB 的共享内存用于存储限流相关的状态信息;rate=2r/s表示限制速率为每秒 2 个请求。
应用限流规则
在需要限流的服务器块(server块)或位置块(location块)中应用上述限流规则:
server {location / {limit_req zone=mylimit;proxy_pass http://backend_server;}}
这样,当客户端访问/路径时,Nginx 会根据mylimit区域的限流规则对请求进行处理。如果客户端的请求速率超过了每秒 2 个,多余的请求将被延迟处理,直到请求速率符合限制。
(二)ngx_http_limit_conn_module 配置示例
定义连接数限制区域
同样在 Nginx 配置文件中,定义一个连接数限制区域。假设我们要限制每个 IP 地址最多只能同时建立 10 个连接,可以这样配置:
http {limit_conn_zone $binary_remote_addr zone=connlimit:10m;}
这里,$binary_remote_addr依旧表示客户端 IP 地址,zone=connlimit:10m定义了一个名为connlimit的连接数限制区域,分配 10MB 共享内存。
应用连接数限制规则
在服务器块或位置块中应用该规则:
server {location / {limit_conn connlimit 10;proxy_pass http://backend_server;}}
当客户端访问/路径时,Nginx 会检查该客户端的 IP 地址与服务器建立的连接数。如果连接数超过 10 个,新的连接请求将被拒绝。
(三)限制文件上传速率
Nginx 可以通过client_max_body_size指令来限制上传文件的大小,同时利用limit_rate指令限制上传速率。client_max_body_size用于设置客户端请求体的最大大小,超过这个大小的请求将被 Nginx 拒绝。例如,设置最大上传文件大小为 10MB:
http {client_max_body_size 10M;}
要限制文件上传速率,可以在location块中使用limit_rate指令。假设要将上传速率限制为每秒 100KB:
server {location /upload {limit_rate 100k;proxy_pass http://upload_server;}}
这样,当用户向/upload路径上传文件时,Nginx 会将上传速率限制在每秒 100KB。
(四)限制文件下载速率
与限制上传速率类似,Nginx 通过limit_rate指令来限制文件下载速率。可以在需要限制下载速率的location块中进行配置。例如,将某个文件目录的下载速率限制为每秒 200KB:
server {location /download {limit_rate 200k;alias /path/to/download/directory;}}
当用户从/download路径下载文件时,Nginx 会按照设定的每秒 200KB 的速率进行传输。如果希望对不同用户或不同类型的文件设置不同的下载速率,可以结合 Nginx 的变量机制,如$remote_addr(客户端 IP 地址)或自定义的变量来实现更灵活的配置。
四、Nginx 限流的实际应用场景
(一)保护后端 API
在微服务架构中,后端 API 往往是整个系统的核心。通过 Nginx 对 API 请求进行限流,可以防止恶意请求或突发的大量请求对 API 服务器造成冲击,确保 API 的稳定运行。例如,对于一些收费 API 接口,通过限流可以控制用户的使用频率,保护 API 提供商的利益。
(二)防止爬虫滥用
网络爬虫在抓取网站内容时,如果不加限制,可能会对网站服务器造成巨大压力。利用 Nginx 限流功能,可以限制爬虫的访问频率和并发连接数,保护网站的正常运营。例如,对于一些新闻网站,可以限制每个爬虫 IP 在一定时间内的请求次数,防止其过度抓取内容。
(三)保障关键业务服务质量
在企业级应用中,不同业务的重要性和资源需求各不相同。通过 Nginx 限流,可以优先保障关键业务的服务质量。比如,在银行系统中,转账、查询余额等核心业务的请求可以设置较低的限流阈值,确保这些业务在高并发情况下也能正常运行,而一些非关键业务(如用户反馈页面的访问)可以设置相对较高的限流阈值。
五、总结
Nginx 的限流功能为我们在应对高并发场景时提供了一种简单而有效的解决方案。通过合理配置ngx_http_limit_req_module、ngx_http_limit_conn_module模块以及相关的速率限制指令,我们可以根据不同的业务需求灵活地实现请求速率限制、连接数限制以及文件上传和下载速率的限制。
相关文章:
Nginx 限流功能:原理、配置与应用
Nginx 限流功能:原理、配置与应用 在当今互联网应用的高并发场景下,服务器面临着巨大的压力。为了确保系统的稳定运行,保障核心业务的正常开展,限流成为了一项至关重要的技术手段。Nginx 作为一款高性能的 Web 服务器和反向代理服…...
【大模型学习】第十九章 什么是迁移学习
目录 1. 迁移学习的起源背景 1.1 传统机器学习的问题 1.2 迁移学习的提出背景 2. 什么是迁移学习 2.1 迁移学习的定义 2.2 生活实例解释 3. 技术要点与原理 3.1 迁移学习方法分类 3.1.1 基于特征的迁移学习(Feature-based Transfer) 案例说明 代码示例 3.1.2 基于…...
小米路由器SSH下安装DDNS-GO
文章目录 前言一、下载&安装DDNS-GO二、配置ddns-go设置开机启动 前言 什么是DDNS? DDNS(Dynamic Domain Name Server)是动态域名服务的缩写。 目前路由器拨号上网获得的多半都是动态IP,DDNS可以将路由器变化的外网I…...
C++ 布尔类型(bool)深度解析
引言 在 C 编程里,布尔类型(bool)是一种基础且极为关键的数据类型。它专门用于表达逻辑值,在程序的条件判断、循环控制等诸多方面都发挥着重要作用。接下来,我们将对 C 中的布尔类型展开全面且深入的探讨。 一、布尔…...
树莓科技集团董事长:第五代产业园运营模式的深度剖析与展望
第五代产业园运营模式,以创新为核心驱动,强调数字化、网络化和资源整合。树莓科技集团在这一领域具有代表性,其运营模式值得深入剖析。 核心特征 数字化转型:第五代产业园高度重视数字化技术的应用,通过构建数字化平…...
go语言zero框架拉取内部平台开发的sdk报错的修复与实践
在开发过程中,我们可能会遇到由于认证问题无法拉取私有 SDK 的情况。这种情况常发生在使用 Go 语言以及 Zero 框架时,尤其是在连接到私有平台,如阿里云 Codeup 上托管的 Go SDK。如果你遇到这种错误,通常是因为 Go 没有适当的认证…...
手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...
工业三防平板AORO-P300 Ultra,开创铁路检修与调度数字化新范式
在现代化铁路系统的庞大网络中,其设备维护与运营调度的精准性直接影响着运输效率和公共安全。在昼夜温差大、电磁环境复杂、震动粉尘交织的铁路作业场景中,AORO-P300 Ultra工业三防平板以高防护标准与智能化功能体系,开创了铁路行业移动端数字…...
LInux基础--apache部署网站
httpd的安装 yum -y install httpdhttpd的使用 启动httpd systemctl enable --now httpd使用enable --now 进行系统设置时,会将该服务设置为开机自启并且同时开启服务 访问httpd 创建虚拟主机 基于域名 在一台主机上配置两个服务server1和server2,其…...
Linux内核套接字以及分层模型
一、套接字通信 内核开发工程师将网络部分的头文件存储到一个专门的目录include/net中,而不是存储到标准位置include/linux。 计算机之间通信是一个非常复杂的问题: 如何建立物理连接?使用什么样的线缆?通信介质有那些限制和特殊…...
Linux《基础开发工具(中)》
在之前的Linux《基础开发工具(上)》当中已经了解了Linux当中到的两大基础的开发工具yum与vim;了解了在Linux当中如何进行软件的下载以及实现的基本原理、知道了编辑器vim的基本使用方式,那么接下来在本篇当中将接下去继续来了解另…...
使用1Panel一键搭建WordPress网站的详细教程(全)
嘿,各位想搭建自己网站的朋友们!今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话,我之前对服务器运维一窍不通,但通过这次尝试,我发现原来建站可以这么简单!下面是我的亲身经历和一些小技巧…...
uni-app学习笔记——自定义模板
一、流程 1.这是一个硬性的流程,只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面,都如第二步一样;可以选择自定义的模版(vue3Setup——这是我自己的模版),第二步的…...
kotlin基础知识点汇总
对象类继承变量常量静态常量定义方法重载方法基本数据类型比较类型转换符字符串比较数组循环角标循环高级循环判断器构造函数类创建私有化 set 方法私有化 get 方法枚举接口匿名内部类内部类内部类访问外部类同名变量抽象类静态变量和方法可变参数泛型构造代码块静态代码块方法…...
git备份or打补丁
起因 在工作中使用git pull突然发现仓库出现了找不到代码库问题,但是这个时候有个对策又急着需要,于是乎,就需要备份,拷贝给另一个工程师输出。 git 打补丁操作 工程师A生成补丁文件 touch a.txtgit add a.txtgit commit -m &qu…...
如何使用GuzzleHttp库:详细教程与代码示例
GuzzleHttp 是一个功能强大的 PHP HTTP 客户端库,它可以帮助开发者方便地发送 HTTP 请求。与传统的 cURL 相比,Guzzle 提供了一个更简单且易于使用的 API,并且支持同步和异步请求。以下是 GuzzleHttp 的使用方法和一些高级特性。 一、安装 G…...
数据结构——顺序表seqlist
前言:大家好😍,本文主要介绍了数据结构——顺序表部分的内容 目录 一、线性表的定义 二、线性表的基本操作 三.顺序表 1.定义 2. 存储结构 3. 特点 四 顺序表操作 4.1初始化 4.2 插入 4.2.1头插 4.2.2 尾插 4.2.3 按位置插 4.3 …...
使用位运算如何找到数组中只出现一次的数?
题目链接:137. 只出现一次的数字 II - 力扣(LeetCode) 算法解析 位运算是用于二进制的运算符号。而对于多次出现的数字,其二进制都是一模一样的,这里是3次重复的出现是数字。由此我们可以想到,如果我们由低…...
Linux笔记之通配符和正则表达式的区别
Linux笔记之通配符和正则表达式的区别 code review! 参考笔记 1.Linux笔记之通配符和正则表达式的区别 2.C++笔记之C语言中的换行符和转义符 文章目录 Linux笔记之通配符和正则表达式的区别1.通配符概念2.通配符和正则表达式的区别3.C++或C语言中有没有通配符?4.Linux Bash脚…...
防汛应急包,快速响应,守护安全
根据中国水利部统计,自1949年以来,我国几乎每年都面临洪水威胁,其中20世纪90年代后洪涝灾害频率显著增加,仅1990-2009年间就发生超4000起较大灾害,直接经济损失近3万亿元,受灾人口达20亿人次。在2020年长江…...
小记一下Zookeeper配置中心的部分原理
记录一下,这里其实很类似nacos的Value,注解,可以结合去理解。 Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {Class<?> beanClass bean.getClass();Field[] fields …...
蓝桥杯备赛-基础训练(四)字符串 day17
好久不见,今天开始继续更新,或许拿不了奖,但是希望记录自己学习的过程,如果感觉有收获的同学在下面多多评论说说我代码的缺陷,感谢大家! 1、反转字符串 编写一个函数,其作用是将输入的字符串反…...
软件工程概述、软件过程模型、逆向工程(高软45)
系列文章目录 软件工程概述、软件过程模型、逆向工程。 文章目录 系列文章目录前言一、软件工程概述二、能力成熟度模型1.能力成熟度模型CMM2.能力成熟度模型集成CMMI 三、软件过程模型1.瀑布模型SDLC2.原型化模型3.螺旋模型4.增量模型5.喷泉模型6.敏捷模型7.统一过程模型RUP 四…...
数据结构--邻接表
回顾上节: 邻接矩阵--数组实现的顺序存储,空间复杂度高,不合适存储稀疏图。On^2 一、邻接表法(顺序链式存储) 无向图: 用一维数组存储顶点信息,使用指针存储顶点的第一条边/弧。对于边/弧&…...
ChromeOS 134 版本更新
ChromeOS 134 版本更新 一、ChromeOS 134 更新内容 1. ChromeOS 自助终端(Kiosk)模式支持隔离 Web 应用(Isolated Web Apps) 从 ChromeOS 134 开始,自助终端(Kiosk)模式支持 隔离 Web 应用&a…...
node.js-WebScoket心跳机制(服务器定时发送数据,检测连接状态,重连)
1.WebScoket心跳机制是? 基于上一篇文章,WebScoket在浏览器和服务器间完成一次握手,两者间创建持久性连接,并进行双向数据连接。node.js-node.js作为服务器,前端使用WebSocket(单个TCP连接上进行全双工通讯…...
【蓝桥杯—单片机】第十五届省赛真题代码题解析 | 思路整理
第十五届省赛真题代码题解析 前言赛题代码思路笔记竞赛板配置建立模板明确基本要求显示功能部分频率界面正常显示高位熄灭 参数界面基础写法:两个界面分开来写优化写法:两个界面合一起写 时间界面回显界面校准校准过程校准错误显示 DAC输出部分按键功能部…...
神经网络的数据集处理
离不开这个库torch.utils.data,这个库有两个类一个Dataset和Dataloader Dataset(对单个样本处理) Dataset 是一个非常重要的概念,它主要用于管理和组织数据,方便后续的数据加载和处理。以下以 PyTorch 为例ÿ…...
深入解析 JVM —— 从基础概念到实战调优的全链路学习指南
文章目录 一、为什么要学习 JVM?1. 面试必备与技能提升2. 性能优化与问题诊断3. 编写高质量代码 二、JVM 基础概念与体系结构1. JVM 简介2. JDK、JRE 与 JVM 三、JVM 内存模型1. 线程私有区2. 线程共享区 四、类加载机制与双亲委派1. 类加载过程2. 双亲委派模型3. 动…...
VLAN和Trunk实验
VLAN和Trunk实验 实验拓扑 实验需求 1.按照图示给所有路由器(此处充当pc机)配置IP地址 2.SW1和SW2上分别创建vlan10和vlan20,要求R1和R3属于vlan10,R2和R4属于vlan20 3.SW1和SW2相连的接口配置类型为trunk类型,允许…...
