nginx-限流(请求/并发量)
一. 简述:
在做日常的web运维工作中,难免会遇到服务器流量异常,负载过大等情况。恶意攻击访问/爬虫等非正常性请求,会带来带宽的浪费,服务器压力增大,影响业务质量。
二. 限流方案:
对于这种情况, 一般可考虑通过nginx的ngx_http_limit_conn_module模块和ngx_http_limit_req_module 模块限制同一client ip的请求量和并发数来防范。
1. ngx_http_limit_conn_module模块(限制连接数[并发])
语法: limit_conn_zone $variable zone=name:size;
默认值: none
配置段: http
语法:limit_conn_log_level info | notice | warn | error
默认值:error
配置段:http, server, location
当达到最大限制连接数后,记录日志的等级。
语法:limit_conn zone_name number
默认值:none
配置段:http, server, location
指定每个给定键值的最大同时连接数,当超过这个数字时被返回503
limit_conn_status
语法: limit_conn_status code;
默认值: limit_conn_status 503;
配置段: http, server, location
该指定在1.3.15版本引入的。指定当超过限制时,返回的状态码。默认是503。
limit_rate
语法:limit_rate rate
默认值:0
配置段:http, server, location, if in location
对每个连接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。
2. ngx_http_limit_req_module模块(限制请求数)
语法: limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
limit_req_log_level
语法: limit_req_log_level info | notice | warn | error;
默认值: limit_req_log_level error;
配置段: http, server, location
设置你所希望的日志级别
limit_req_status
语法: limit_req_status code;
默认值: limit_req_status 503;
配置段: http, server, location
limit_req
语法: limit_req zone=name [burst=number] [nodelay];
默认值: —
配置段: http, server, location
设置对应的共享内存限制域和允许被处理的最大请求数阈值。 如果请求的频率超过了限制域配置的值,请求处理会被延迟,,当被延迟的请求数超过了定义的阈值,这个请求会被终止,并返回503;nodelay:表示当超过访问次数并缓冲也满的情况下,直接放回503错误,若不设置,这些多余的请求会延迟处理 。
三. 实际运用案例:
一般情况下key使用$binary_remote_addr(建议使用)或者$remote_addr变量二者区别在于: $remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。$binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。当恭喜内存空间被耗尽时,服务会对后续请求返回503(切记).
http{.........limit_conn_zone $binary_remote_addr zone=addr:1000m;limit_req_zone $binary_remote_addr zone=addrs:1000m rate=10r/s; #每秒请求10次...........server{......limit_conn addr 10; #限制并发数为10limit_req zone=addrs burst=5 nodelay; #允许超出请求5(排队/延迟)......}}
#注 limit_conn_zone 和limit_req_zone可单独使用 除以上以$binary_remote_addr变量为key外,还有一种情况,如前端使用了代理层,CDN等服务,这种情况下$binary_remote_addr变量会是代理层/CDN的ip,就无法通过$binary_remote_addr变量做限制, 目前知道有两种解决方式,一种是使用白名单, 另外一种是配置$http_x_forwarded_for然后取逗号分隔的第一个ip(即源ip,不太好的消息就是这个变量字段是可以通过修改请求head信息进行伪造(curl -H "X-Forwarded-For:192.168.0.1,192.168.0.2" http://127.0.0.1 ))。白名单的方式后续再说。这里先说下第二种方法, 可通过nginx的map模块做正则匹配后映射请求源ip, 具体配置如下:
1)代理层的配置:
upstream renren_trans_1 {server 10.5.11.12;}server {listen 80;server_name zabbixtest.d.xiaonei.com;http_accounting_id zabbixtest;location / {proxy_pass http://renren_trans_1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 50m;client_body_buffer_size 128k;client_body_temp_path /data/client_body_temp;proxy_connect_timeout 15;proxy_send_timeout 300;proxy_read_timeout 300;proxy_buffer_size 8k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;proxy_temp_path /data/proxy_temp;}} 代理层后端(业务机)配置:
map $http_x_forwarded_for $clientips {"" $remote_addr; #当为空时映射$remote_addr 到$clientips~^(?P<firstip>[0-9\.]+),?.*$ $firstip; #获取第一个ip}limit_conn_zone $clientips zone=addr:1000m;limit_req_zone $clientips zone=addrs:1000m rate=10r/s;limit_req zone=addrs burst=5 nodelay;server {listen 80;server_name localhost;limit_conn addr 10;limit_req zone=addrs burst=5 nodelay;#charset koi8-r;#access_log logs/host.access.log main; 测试:
1) 测试通过代理层访问的方式:
# ab -c 11 -t 10 http://zabbixtest.d.xiaonei.com/test.html
access.log内容如下:

可发现大量503 error(第一列代理层,最后一列源ip) 。
2) 测试直接访问,不通过代理层;
# ab -c 5 -t 10 http://10.5.11.12/test.html
access.log如下:

同样会出现大量503 ,代理ip为空!
----------------------------------------------------------------------------------------------
深耕运维行业多年,擅长linux、容器云原生、运维自动化等方面。
承接各类运维环境部署、方案设计/实施、服务代运维工作,欢迎沟通交流 !

相关文章:
nginx-限流(请求/并发量)
一. 简述: 在做日常的web运维工作中,难免会遇到服务器流量异常,负载过大等情况。恶意攻击访问/爬虫等非正常性请求,会带来带宽的浪费,服务器压力增大,影响业务质量。 二. 限流方案: 对于这种情…...
Vue——使用html2pdf插件,下载pdf文档到本地
1.安装 html2pdf官网地址 npm install html2pdf.js pnpm add html2pdf.js2.引入 import html2pdf from html2pdf.js3.我的项目是使用的原生avascript,table tr td画表格然后通过html2pdf插件下载pdf。 问题:下载pdf时内容被截断,如下图所示…...
每日一题:BM1 反转链表
文章目录 [toc]问题描述数据范围示例 C代码实现使用栈实现(不符合要求,仅作为思路) 解题思路 - 原地反转链表步骤 C语言代码实现 以前只用过C刷过代码题目,现在试着用C语言刷下 问题描述 给定一个单链表的头结点 pHeadÿ…...
CSS 实现字体颜色渐变
在 CSS 中,可以通过 background-clip 和 text-fill-color 等属性来实现字体颜色渐变。以下是实现字体颜色渐变的基本步骤和示例代码: 示例代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8" /&…...
【软考网工笔记】计算机基础理论与安全——网络安全
病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒; 3. 宏病毒可以感染后缀为.xls的文件;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…...
JS数组转字符串(3种方法)
JavaScript 允许数组与字符串之间相互转换。其中 Array 方法对象定义了 3 个方法,可以把数组转换为字符串,如表所示。 Array 对象的数组与字符串相互转换方法 数组方法 说明 toString() 将数组转换成一个字符串 toLocalString() 把数组转换成本地约定的…...
云计算安全需求分析与安全防护工程
23.1 概念与威胁分析 1)概念 在传统计算环境下,用户构建一个新的应用系统,需要做大量繁杂的工作,如采购硬件设备、安装软件包、编写软件,同时计算资源与业务发展难以灵活匹配,信息系统项目建设周期长。随…...
C/C++的printf会调用malloc()
排查内存问题(或相关的疑难杂症)时,可能一句printf就能让bug出现,或者赶走bug。你可能觉得很神奇,但这并不神奇。 至少我们可以在 Linux-x64 下,通过 malloc hook,来验证当前的编译环境下&…...
spring mvc源码学习笔记之五
pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...
3272 小蓝的漆房
将devc设置支持编译就能用新的遍历方式 for(auto &x : s)//遍历容器s,变量为x /* 多循环的嵌套: 计数是否需要重置为0; 是否因为ans定义成全局变量导致ans在比较多时候会出现错误*/ /* 1.对于一个标准色,对目标数组遍历, 如…...
MySQL使用触发器进行备份
触发器脚本备份 实现方案: 1.配置mysql调用外部脚本的插件mysqludf 链接:https://pan.baidu.com/s/1MCrf1u_SRWwcZoxM9JDNiw 提取码:kgt0 解压 2.解压后放进: mysql安装路径/lib/plugin/ 3.在mysql执行命令创建自定义函数&…...
数据结构与算法-顺序表
数据结构 顺序表 基本概念 顺序表:顺序存储的线性表链式表:链式存储的线性表,简称链表 顺序存储就是将数据存储到一片连续的内存中,在C语言环境下,可以是具名的栈数组,也可以是匿名的堆数组。 存储方式…...
OpenAI CEO 奥特曼发长文《反思》
OpenAI CEO 奥特曼发长文《反思》 --- 引言:从 ChatGPT 到 AGI 的探索 ChatGPT 诞生仅一个多月,如今我们已经过渡到可以进行复杂推理的下一代模型。新年让人们陷入反思,我想分享一些个人想法,谈谈它迄今为止的发展,…...
Shell编程详解
文章目录 一、Linux系统结构二、Shell介绍1、Shell简介2、Shell种类3、Shell查询和切换 三、Shell基础语法1、注释2、本地变量3、环境变量3.1、查看环境变量3.2、临时设置环境变量3.3、永久设置环境变量 4、特殊变量5、控制语句5.1、shell中的中括号5.2、if语句5.3、for循环5.4…...
跨站脚本攻击(XSS)详解
跨站脚本攻击(XSS)详解 跨站脚本攻击(XSS,Cross-Site Scripting)是一种通过在网页中注入恶意脚本,攻击用户浏览器的漏洞。攻击者可以利用XSS窃取用户敏感信息、劫持会话、或在受害者浏览器中执行恶意操作。…...
03-QT中的QMainWindow+对话框QDialog
文章目录 1.QMainWindow1.1菜单栏1.2 工具栏1.3 状态栏1.4 铆接部件1.5 核心部件(中心部件)1.6 资源文件 2.对话框2.1 基本概念2.2 标准对话框2.3 自定义消息框2.4 消息对话框2.5 标准文件对话框 1.QMainWindow QMainWindow是一个为用户提供主窗口程序的…...
c# 中Parallel.ForEach 对其中一个变量进行赋值 引发报错
在 C# 中使用 Parallel.ForEach 方法时,如果你尝试在并行循环中对共享变量进行赋值,很可能会遇到线程安全问题或竞争条件(race conditions),这可能导致数据不一致、程序崩溃或其他不可预测的行为。 问题描述 假设你有…...
ElasticSearch备考 -- 整体脉络梳理
1、 search 、Update、reindex ElasticSearch 备考 -- 查询&高亮&排序 ElasticSearch 备考 -- 聚合查询 ElasticSearch 备考 -- 异步检索 2、search temple ElasticSearch备考 -- Search template 3、custom analyzer ElasticSearch 备考 -- 自定义分词 2、…...
vue Element Ui Upload 上传 点击一个按钮,选择多个文件后直接上传,使用防抖解决多次上传的问题。
问题: 在使用Element Ui Upload 上传文件时,选择多个文件上传时,on-change事件会一个一个返回上传的文件,导致前端不知道什么时候可以拿到全部上传的文件,再一起调后台接口。 解决方法: 上传文件后&…...
【HF设计模式】05-单例模式
声明:仅为个人学习总结,还请批判性查看,如有不同观点,欢迎交流。 摘要 《Head First设计模式》第5章笔记:结合示例应用和代码,介绍单例模式,包括遇到的问题、采用的解决方案、以及达到的效果。…...
Ultrascale SelectIO 仿真实战:ISERDESE3与OSERDESE3的时钟域与数据流协同设计
1. Ultrascale SelectIO接口设计基础 在Xilinx Ultrascale架构中,SelectIO接口是实现高速串行通信的关键模块。我第一次接触ISERDESE3和OSERDESE3时,就被它们强大的时钟域处理能力所震撼。简单来说,ISERDESE3负责将高速串行数据转换为并行数据…...
AI设计:核心方法、工具选型与商业落地实操指南
近两年AI技术在设计领域的渗透速度远超行业预期,很多设计师对AI的认知还停留在生成零散创意素材的阶段,不少设计师担心被AI替代,也有不少设计师把AI当成玩具,没有挖掘到实际的商用价值。据国内设计行业协会2024年调研数据显示&…...
告别官方库!手把手教你用ESP32模拟SPI驱动ST7735屏幕(附完整代码与避坑指南)
告别官方库!手把手教你用ESP32模拟SPI驱动ST7735屏幕(附完整代码与避坑指南) 在嵌入式开发中,我们常常会遇到这样的困境:官方提供的库文件要么过于臃肿,要么与我们的硬件配置不完全兼容。特别是当你在Ardui…...
拯救者笔记本电池健康管理深度指南:LenovoLegionToolkit专业配置方案
拯救者笔记本电池健康管理深度指南:LenovoLegionToolkit专业配置方案 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...
Stable Yogi Leather-Dress-Collection入门必看:2.5D皮衣生成与传统3D建模工作流对比
Stable Yogi Leather-Dress-Collection入门必看:2.5D皮衣生成与传统3D建模工作流对比 1. 工具介绍 Stable Yogi Leather-Dress-Collection是一款基于Stable Diffusion v1.5和Anything V5动漫底座模型开发的2.5D皮衣穿搭生成工具。它通过创新的技术方案,…...
OpenSTA完整指南:3步掌握开源静态时序分析引擎的终极解决方案
OpenSTA完整指南:3步掌握开源静态时序分析引擎的终极解决方案 【免费下载链接】OpenSTA OpenSTA engine 项目地址: https://gitcode.com/gh_mirrors/op/OpenSTA OpenSTA是一款强大的开源门级静态时序验证工具,能够帮助芯片设计团队使用Verilog网表…...
一键克隆开发环境,告别配置地狱
核心需求与痛点分析开发/测试环境配置复杂,重复搭建耗时依赖冲突导致环境不一致,引发“在我机器上能运行”问题新成员加入或设备更换时环境迁移成本高技术实现原理容器化技术(Docker/LXC)封装环境依赖虚拟机快照(VMwar…...
传统SLAM使用CUDA加速,优势究竟有多大?
深度学习在SLAM中主要用于:动态目标剔除、语义SLAM的目标检测与分割。特征点提取与匹配(SuperPoint、SuperGlue)。场景描述符与重定位。工程建议:CUDA对传统SLAM有明显优势,尤其在视觉稠密前端、激光点云匹配、后端优化…...
【Hello Agents进阶篇学习笔记】01智能体经典范式构建
Hello Agents进阶篇学习笔记Agent核心目标Agent主要问题经典Agent范式ReAct系统结构总结ReAct代码结构总结ReAct Agent 核心实现Agent核心目标 把LLM升级成Agent: 从静态(只能回答问题)到动态(理解任务调用工具动态决策ÿ…...
实战指南:从零搭建Nexus私服并自动化部署SNAPSHOT版本
1. Nexus私服的核心价值与场景定位 在团队协作开发中,依赖管理就像是一个不断膨胀的"共享文件夹"。我曾经经历过一个20人团队同时开发微服务项目的混乱场景:有人用本地编译的SNAPSHOT包,有人直接从中央仓库拉取旧版本,还…...
