Nginx中的limit_req模块和limit_conn模块详解

引言

在高流量场景下,良好的限流和连接控制策略至关重要,以防止服务器过载,确保服务稳定性和高可用性。Nginx 提供了 limit_req 和 limit_conn 模块,用以实现请求频率和并发连接数的限制。本文将详细介绍这两个模块的生效阶段和生效范围,并提供实际配置示例,解释相关指令的作用。

limit_req模块

功能介绍

limit_req 模块用于限制客户端请求的频率,以防止单一客户端占用过多服务器资源,提升稳定性。

生效阶段

limit_req 在请求处理的“访问阶段(access phase)”生效。它在接收到完整的 HTTP 请求后,即将转发到后端之前进行限流。

生效范围

  • http:全局范围,作用于所有 server 和 location。
  • server:作用于特定 server block 内的所有 location。
  • location:作用于特定 URL 路径的 location。

配置示例和注释

http {# 定义一个共享内存区域,用于存储请求状态# $binary_remote_addr 是客户端的 IP 地址# zone=one:10m 定义名为 "one" 的共享内存区域,大小为 10MB# rate=1r/s 限制请求速率为每秒 1 个请求limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {listen 80;server_name example.com;location /api/ {# 应用请求频率限制配置# zone=one 引用名为 "one" 的共享内存区域# burst=5 允许短时间内突发最多 5 个请求# nodelay 如果设置该参数,突发请求也会立即执行limit_req zone=one burst=5 nodelay;# 代理到后端服务proxy_pass http://backend_service;}}
}

参数解析

  • limit_req_zone:声明一个限制请求的共享内存区域。
  • limit_req:在指定的区域内启用请求频率限制。
  • burst:允许的突发请求数量。
  • nodelay:不延迟处理突发请求。

limit_conn模块

功能介绍

limit_conn 模块用于限制每个客户端的并发连接数,以防止资源被单一客户端耗尽。

生效阶段

limit_conn 在连接处理的“访问阶段(access phase)”生效。当服务器建立新连接时,立即根据配置进行并发连接限制。

生效范围

  • http:全局范围,作用于所有 server 和 location。
  • server:作用于特定 server block 内的所有 location。
  • location:作用于特定 URL 路径的 location。

配置示例和注释

http {# 定义一个共享内存区域,用于存储连接状态# $binary_remote_addr 是客户端的 IP 地址# zone=addr:10m 定义名为 "addr" 的共享内存区域,大小为 10MBlimit_conn_zone $binary_remote_addr zone=addr:10m;server {listen 80;server_name example.com;location /api/ {# 应用并发连接限制配置# addr 引用名为 "addr" 的共享内存区域# 10 限制每个客户端最多允许 10 个并发连接limit_conn addr 10;# 代理到后端服务proxy_pass http://backend_service;}}
}

参数解析

  • limit_conn_zone:声明一个限制连接数的共享内存区域。
  • limit_conn:在指定的区域内启用连接数限制。

日志和状态设置

limit_conn_log_level

limit_conn_log_level 用于设置当连接被限制时的日志记录级别。

可选值
  • info:基本信息记录。
  • notice:详细信息记录。
  • warn:警告信息记录(推荐)。
  • error:错误信息记录。

limit_conn_status

limit_conn_status 用于设置当连接被限制时返回的 HTTP 状态码。

常用状态码
  • 503:服务不可用(推荐)。
  • 其他自定义状态码:根据具体需求设置。

完整配置示例和注释

http {# 为 limit_req 和 limit_conn 定义共享内存区域limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;limit_conn_zone $binary_remote_addr zone=addr:10m;# 设置限制被触发时的日志级别和返回状态码limit_conn_log_level warn;limit_conn_status 503;server {listen 80;server_name example.com;location /api/ {# 应用请求频率限制配置limit_req zone=one burst=5 nodelay;# 应用并发连接限制配置limit_conn addr 10;# 代理到后端服务proxy_pass http://backend_service;}}
}

解析与说明

  • limit_req_zone 和 limit_conn_zone:分别定义请求和连接限制的共享内存区域。
  • limit_req 和 limit_conn:在指定的区域内启用请求频率和连接数限制。
  • limit_conn_log_level 和 limit_conn_status:分别设置连接限制触发时的日志级别和返回状态码。

结论

通过 Nginx 的 limit_req 和 limit_conn 模块,可以有效实现精确的请求频率和连接数控制。这不仅可以防止恶意请求和流量激增对服务器的冲击,还能提高服务的稳定性和可用性。结合日志级别和状态码设置,可以轻松监控和管理限流情况。

希望这篇博客能够帮助你更好地理解和应用 Nginx 的限流功能,提高配置能力。

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

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

相关文章

TikTok电商带货特训营,跟随时代潮流,跨境掘金(8节课)

课程内容: 1-先导课 2-一、店铺运营认知与思路 3-二、店铺风控注意事项 4-三、美区Tiktok前期工作-1店铺入驻模式 5-三、美区Tiktok前期工作-2指纹浏览器介绍 6-三、美区Tiktok前期工作-4绑定电话号码 7-三、美区Tiktok前期工作-5添加仓库地址 8-三、美区Ti…

GIS读研与求职准备:植被定量遥感专业研0

本文介绍植被定量遥感专业研究生入学初期,为将来从事开发类工作所作求职准备的规划路径、方向选择等方面的建议。 前面提到了,最近有很多师弟师妹询问关于研究生方向选择、求职准备等方面的问题。因为很多朋友的提问比较有共性,所以会在征得对…

【秒杀系统】从零开始打造简易秒杀系统(一):防止超卖

【秒杀系统】从零开始打造简易秒杀系统(一):防止超卖 前言 大家好,好久不发文章了。(快一个月了- -)最近有很多学习的新知识想和大家分享,但无奈最近项目蛮忙的,很多文章写了一半搁…

redis笔记1

1-nosql(非关系型数据库) 定位缓存,提高数据读写速度,减轻对数据储存与访问压力,不建议存敏感数据(重要数据)。 2-特征 (1)键值(key-value)型 &a…

【面试】Oracle JDK和Open JDK什么关系?

目录 1. 起源与发展2. 代码与许可3. 功能与组件4. 使用场景5. 版本更新与支持 1. 起源与发展 1.Oracle JDK是由Oracle公司基于Open JDK源代码开发的商业版本。2.Open JDK是java语言的一个开源实现。 2. 代码与许可 1.Oracle JDK包含了闭源组件,并根据二进制代码许…

深入Java:JSON解析与操作的艺术

哈喽,大家好,我是木头左! 一、初识JSON:数据格式的优雅舞者 在现代Web开发中,JSON(JavaScript Object Notation)以其轻量级和易于阅读的特点成为了数据交换的首选格式。它基于JavaScript的一个…

用最通俗的话理解什么是协程

参考: 用最通俗的话理解什么是协程-CSDN博客

FreeRTOS_信号量_学习笔记

信号量的特性 消息队列用于传输多个数据,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示。套用队列笔记中的流水线例子,可以理解为流水线上工件的数量。 信号:起通知作用 量:还可以用来表示资源的数量 当…

打印机手动双面打印技巧

一、WORD和PDF (1)首先选择要打印的页面范围,然后选择仅奇数页打印 (2)将打印完的纸张翻过来,白纸朝上,纸张的头部先放入打印机 (3)选择要打印的页面范围,然…

oracle.jdbc.OracleDatabaseException: ORA-00911: 无效字符

先吐槽一句,oracle 真坑啊! 一个很正常的sql 语句一直报 ORA-00911: 无效字符 ,拿到数据库去执行一点问题没有,一运行代码就报错,然后一个字符一个字符的对比,竟然是因为sql 结尾的一个 ";" 导致…

TP6开发文档概述

TP6(ThinkPHP 6)是一个使用PHP语言开发的快速、兼容且简单的面向对象开发框架。以下是一个简化的TP6开发文档概述,涵盖了核心功能和一些常用方法: 一、环境准备 PHP安装:确保已经安装了与TP6兼容的PHP版本。 Composer…

PHPIPAM在建立数据库阶段报错

如题,参考大佬的操作IP地址管理系统phpipam部署-CSDN博客搭建PHPIPAM,不过我没有选择1.4,而是直接搭建了1.6版本,一切顺利,到了最后建立数据库阶段,输入数据库账号和密码后提示Cannot install sql SCHEMA f…

大模型部署_书生浦语大模型 _作业2

本节课可以让同学们实践 4 个主要内容,分别是: 1、部署 InternLM2-Chat-1.8B 模型进行智能对话 1.1安装依赖库: pip install huggingface-hub0.17.3 pip install transformers4.34 pip install psutil5.9.8 pip install accelerate0.24.1…

Elasticsearch之文本分析

文本分析基本概念 官网:Text analysis | Elasticsearch Guide [7.17] | Elastic 官网称为文本分析,这是对文本进行一直分析处理的方式,基本处理逻辑是为按照预先制定的分词规则,把原本的文档进行分割成多个小颗粒度的词项&#x…

Python pands使用引擎实现excel条件格式

截至我的知识更新日期(2023年),Pandas 库本身并不直接支持Excel条件格式。Pandas 是一个强大的Python数据分析库,它主要用于数据分析和操作,而不是用于创建或编辑Excel文件的格式。 然而,你可以使用 openp…

如何给出好的“文言一心”指令?

一、文言一心是什么? 在现代技术背景下,“文言一心”还是百度公司创建的一款大语言模型。这款模型基于飞桨深度学习平台和文心知识增强大模型,并拥有强大的中文语料库,可以理解和生成富含文化内涵和哲理的文本内容。其核心技术架构…

社区医院|基于SprinBoot+vue的社区医院管理服务系统(源码+数据库+文档)

社区医院管理服务系统 目录 基于SprinBootvue的社区医院管理服务系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 4医生功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

看花眼,眼花缭乱的主食冻干到底应该怎么选?靠谱的主食冻干分享

随着科学养猫知识的普及,主食冻干喂养越来越受到养猫人的青睐。主食冻干不仅符合猫咪的饮食天性,还能提供均衡的营养,有助于维护猫咪的口腔和消化系统健康。许多猫主人认识到了主食冻干喂养的诸多益处,计划尝试这种喂养方式&#…

学英语材料:单口喜剧、讲故事、短剧喜剧以及广播剧和播客节目

学习英语节目 有名的单口喜剧、讲故事、短剧喜剧以及广播剧和播客节目: 单口喜剧(Stand-up Comedy) 描述:这是最接近相声的形式,表演者独自一人站在舞台上,用幽默的方式讲述个人经历、观察到的社会现象或…

C++面向对象程序设计 - 标准输出流

在C中,标准输出流通常指的是与标准输出设备(通常是终端或控制台)相关联的流对象。这个流对象在C标准库中被定义为std::cout、std::err、std::clog,它们是std::ostream类的一个实例。 一、cout,cerr和clog流 ostream类…