【nginx】 实现限流

news2024/11/29 6:26:02

这里写自定义目录标题

  • 前言
  • 正文
    • nginx实现限流
      • 并发限制
        • 限制单IP并发数量
        • 限制单主机服务并发数量
      • 速率限制
      • 限流效果
    • 注意
    • 疑问
    • 参考链接
  • 小结

前言

好久不见,还算为时不晚。最近一个月经历了工作的调整,技术栈从Java转向了Go和Python, 工作显得更忙了些,但是还是希望持续输出滴。最近做的产品,领导说要加一个限流功能,下面来看看如何实现。

正文

实现限流功能,限制并发数量,保护上游应用不被过多用户请求压垮,否则接下来的事情就会让人很emo了。

nginx实现限流

初步想法用最基本的计数来实现,后面觉得得改代码还得发版,这个时候还是尽量不要动代码了,发现nginx可以实现该功能。

并发限制

限制同一时间请求连接数量,使用ngx_http_limit_conn_module ,分为限制单IP和服务两种场景,使用limit_conn_zone和limit_conn 指令进行配置。

限制单IP并发数量
# 在http 中配置
http {
# 格式定义 limit_conn_zone key zone=name:size;
limit_conn_zone $binary_remote_addr  zone=mylimit:10m;
...
   server {
      listen 8080;
      # 在location中配置 最大连接数为5个
	    location /xxx{
		     limit_conn mylimit 5;
		     ...
	     }
     }
}

说明:

  • limit_conn_zone 定义一个会话块,记录会话状态信息;
  • zone=mylimit:10m 会话块叫做mylimit,内存容量为10M;
  • $binary_remote_addr 表示请求客户端的IP地址,作为会话请求限制的key,限制同一IP地址的请求连接数;
  • limit_conn mylimit 5 会话块最大连接数为5个,当超过数量限制后,对于后续请求默认返回503 response
    code,也可以使用limit_conn_status 自定义返回的状态码;
限制单主机服务并发数量
http {

limit_conn_zone $server_name zone=serverlimit:10m;
...
   server {
  	 listen 8081;
  	 server_name: xxx;
     location /xxx{
		     limit_conn serverlimit 5;
		     ...
	     }
     }
}

说明:

  • limit_conn_zone 定义一个会话块,记录会话状态信息;
  • zone=serverlimit:10m 会话块叫做serverlimit,内存容量为10M;
  • $server_name 虚拟主机作为会话请求限制的key,限制同一虚拟主机的请求连接数;
  • limit_conn serverlimit 5 会话块最大连接数为5个,当超过数量限制后,对于后续请求默认返回503
    response code,也可以使用limit_conn_status 自定义返回的状态码;

速率限制

限制单位时间内的请求数,使用ngx_http_limit_req_module ,采用漏桶算法,使用limit_req_zone和limit_req 指令进行配置

http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
...
   server {
  	 listen 8081;
  	 server_name: xxx;
     location /xxx {    
         # 格式定义 limit_req zone=name [burst=number] [nodelay];
		     limit_req zone=mylimit burst=5 nodelay;
		     ...
	     }
     }
}

说明:

  • llimit_req_zone 定义一个请求会话块,记录会话状态信息;
  • zone=mylimit:10m 会话块叫做serverlimit,内存容量为10M;
  • $binary_remote_addr 同一客户端IP地址作为会话请求限制的key,限制同一IP地址的请求速度;
  • rate=2r/s 1s允许处理2个请求,nginx实际上以ms为粒度来跟踪请求信息,所以可以理解为500毫秒内只允许通过1个请求,从501毫秒开始才允许通过第二个请求。
  • limit_req zone=mylimit 应用上述http作用域的限流配置
  • burst 设置缓冲区大小,当在单位时间内有超过上述速度的请求过来时(突发流量),可以先放到这个缓冲区内;此缓冲区可以支持存放5个多余请求;
  • nodelay 让缓冲区的请求立即处理,如果不加此参数,缓冲区的请求还是按照原来的2r/s的速度处理,处理完缓冲区的5个请求需要2.5s,加了该配置后,缓冲区的请求可以被立即处理,这样请求数超过burst+rate之后多余的请求会立刻被拒绝处理,就不会有一些tcp连接请求等待。

限流效果

用Apifox或者ab(apachebench)测试并发超过限制的效果(也可通过nginx日志查看响应情况):
在这里插入图片描述
在这里插入图片描述

注意

  • 对某个IP 设置限流时考虑Nginx location匹配的优先级,避免设置了未生效
  • 并发限制的两种限制可以同时使用
  • limit_conn_log_level 和 limit_req_log_level 提供了日志功能

疑问

限制了并发数量,有时候用工具测试时会出现超过并发数量测试通过的情况 ,还没有搞明白,希望路过的朋友们给些指导 Thanks♪(・ω・)ノ

参考链接

https://juejin.cn/post/7121903842102509581?share_token=fed0ddaa-bcf8-4844-b4a2-0a906c98ae38
https://www.cnblogs.com/chenpingzhao/p/4971308.html
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

小结

记录工作日常,还是一个努力搬砖的大朋友~

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

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

相关文章

JavaScript基础—for语句、循环嵌套、数组、冒泡排序、综合案例—根据数据生成柱形图

版本说明 当前版本号[20231126]。 版本修改说明20231126初版 目录 文章目录 版本说明目录JavaScript 基础第三天笔记for 语句for语句的基本使用循环嵌套倒三角九九乘法表 数组数组是什么?数组的基本使用定义数组和数组单元访问数组和数组索引数据单元值类型数组长…

测试工程师必学看系列之Jmeter_性能测试:性能测试的流程和术语

性能测试的流程 一、准备工作 1、系统基础功能验证 一般情况下,只有在系统基础功能测试验证完成、系统趋于稳定的情况下,才会进行性能测试,否则性能测试是无意义的。2、测试团队组建 根据该项目的具体情况,组建一个几人的性能测试…

Linux面试题(三)

目录 34、du 和 df 的定义,以及区别? 35、awk 详解。 36、当你需要给命令绑定一个宏或者按键的时候,应该怎么做呢? 37、如果一个 linux 新手想要知道当前系统支持的所有命令的列表,他需要怎么做? 38、…

23年几个能打的UE4游戏技术选型

近期发现很多的精力放在游戏的整体技术选型以及产生的结果上面,所以回顾下几个游戏的选型和结果; 这里一个是自己玩游戏的画面流畅度的直接感受,以及一直非常喜爱的评测“数毛社”,digital foundry; 23年目前来看&…

【NeRF】3、MobileR2L | 移动端实时的神经光场(CVPR2023)

论文:Real-Time Neural Light Field on Mobile Devices 代码:https://github.com/snap-research/MobileR2L 出处:CVPR2023 贡献: 设计了一套移动端实时的 R2L 网络结构 MobileR2L,在 iphone13 上渲染一张 1008x756…

前端学习--React(4)路由

一、认识ReactRouter 一个路径path对应一个组件component,当我们在浏览器中访问一个path,对应的组件会在页面进行渲染 创建路由项目 // 创建项目 npx create router-demo// 安装路由依赖包 npm i react-router-dom// 启动项目 npm run start 简单的路…

【JavaEE】多线程 (2) --线程安全

目录 1. 观察线程不安全 2. 线程安全的概念 3. 线程不安全的原因 4. 解决之前的线程不安全问题 5. synchronized 关键字 - 监视器锁 monitor lock 5.1 synchronized 的特性 5.2 synchronized 使⽤⽰例 1. 观察线程不安全 package thread; public class ThreadDemo19 {p…

LeetCode中链表类题目十条血泪经验总结-全程干货

文章目录 前言干货经验汇总第一梯队第二梯队 力扣代表性链表题目推荐 前言 链表是以节点(node)存储的链式存储结构,一个node包含一个data域(存放数据)和一个next域(存放下一个node的指针)&…

Co-DETR:DETRs与协同混合分配训练论文学习笔记

论文地址:https://arxiv.org/pdf/2211.12860.pdf 代码地址: GitHub - Sense-X/Co-DETR: [ICCV 2023] DETRs with Collaborative Hybrid Assignments Training 摘要 作者提出了一种新的协同混合任务训练方案,即Co-DETR,以从多种标…

Web框架与Django简介

Web框架与Django简介 一、Web应用的组成 我们为了开发一款Web软件首先要了解什么才是Web应用软件呢? 对于传统的应用软件来说,基本都是部署单机使用,而Web应用软件就不一样,Web应用软件是基于B/S架构的,B和S都在不同…

Vue常见的实现tab切换的两种方法

目录 方法一&#xff1a;事件绑定属性绑定 效果图 完整代码 方法二&#xff1a;属性绑定 动态组件 component标签 效果图 完整代码 方法一&#xff1a;事件绑定属性绑定 效果图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta c…

Qt 样式表

QLabel&#xff0c;应用于Widget&#xff1a; .QLabel {background-color:pink; }.QLabel[warnlevel_1] {border:5px solid yellow; }.QLabel[warnlevel_2] {border:5px solid red; } QWidget{background-color:rgb(54,54,54); }QLineEdit{border: 1px solid #ABCDA0; /…

8 增强型脉宽调制模块ePWM

文章目录 8.1 PWM控制基本原理8.2 PWM结构及组成单位8.3 时基模块TB8.3.1 ePWM时基模块作用8.3.2 时基模块的关键信号和寄存器 8.5 动作模块 AC8.5.1 动作模块的作用8.5.2 动作模块关键信号与寄存器 8.11 PWM模块输出8.11.1 单边非对称波形8.11.2 单边非对称脉冲波形 8.1 PWM控…

STM32F103C8T6_PWM引脚

可以看到&#xff1a;一共可以产生4 x 416路PWM信号&#xff1a;每个TIMER4路PWM&#xff0c; PA0,PA1,PA2,PA3,PA8,PA10,PA11; PA共7个 PB0,PB1,PB6,PB7,PB8,PB9,PB14; PB共7个

【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机&#xff0c;Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code serve…

BrokerChain

BrokerChain: A Cross-Shard Blockchain Protocol for Account/Balance-based State Sharding 我总感觉这篇文章不完整&#xff0c;缺少一些东西。或者说有些地方并没有详细说。比如状态图的构建&#xff0c;网络重分片的的配置过程。都直接忽略了。 Motivation 1 跨片交易不…

Qt5.15.2静态编译 VS2017 with static OpenSSL

几年前编译过一次Qt静态库:VS2015编译Qt5.7.0生成支持XP的静态库,再次编译,毫无压力。 一.环境 系统:Windows 10 专业版 64位 编译器:visual studio 2017 第三方工具:perl,ruby和python python用最新的3.x.x版本也是可以的 这三个工具都需要添加到环境变量,安装时勾选…

Android aidl的简单使用

一.服务端 1.创建aidl文件&#xff0c;然后记得build下生成java文件 package com.example.aidlservice31;// Declare any non-default types here with import statementsinterface IMyAidlServer {// 接收一个字符串参数void setData(String value);// 返回一个字符串String …

windows通过regsvr32注册dll文件失败

1、注册dll文件失败 最近在研究中文输入法&#xff0c;下载SampleIME源码后编译得到SampleIME.dll&#xff0c;最后只需要将输入法安装&#xff08;即注册&#xff09;就可以使用了。 但是通过命令&#xff1a; regsvr32 C:\Windows\System32\SampleIME.dll 注册时却提示错…

使用花生壳外网远程ssh访问内网主机 亲测有效

经常会遇到远程访问其他电脑的需求&#xff0c;一般首选向日葵软件&#xff0c;傻瓜式的连接远程桌面控制&#xff0c;非常方便。但是仅限于远程桌面远程协助这种。 对于程序员来说最佳的登录方式是ssh&#xff0c;同时远程桌面连过来的时候分辨率比较低&#xff0c;图形效果相…