【nginx】 实现限流

这里写自定义目录标题

  • 前言
  • 正文
    • 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.hqwc.cn/news/221250.html

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

相关文章

B树与B+树的对比

B树: m阶B树的核心特性: 树中每个节点至多有m棵子树,即至多含有m-1个关键字根节点的子树数属于[2, m],关键字数属于[1, m-1],其他节点的子树数属于 [ ⌈ m 2 ⌉ , m ] [\lceil \frac{m}{2}\rceil, m] [⌈2m​⌉,m]&am…

【学习记录】从0开始的Linux学习之旅——驱动模块编译与加载

一、概述 Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程,具有强大的网络功能和良好的兼容性。本文主要讲述如何编译及加载linux驱动模块。 二、概念及原理 应用程序通过系统调用与内…

【Amazon】安装Cloudwatch代理监控EC2

文章目录 一、实验概要二、实验操作步骤2.1 创建 CloudWatch 代理运行角色2.2 安装 CloudWatch 代理软件包2.3 使用 CloudWatch代理收集指标2.4 CloudWatch指标收集确认 三、参考链接 一、实验概要 使用 CloudWatch 代理从 Amazon EC2 实例和本地服务器中收集指标、日志和跟踪信…

IDEA DeBug

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 01_Debug简介和意义 什么是程序DeBug&am…

AIGC ChatGPT 4 快速整理不规则数据

从业务系统中采集到的数据如下: 序号 省份 英文 2022年销售额 2021年销售额 增量 1 广东guangDOng129068.58 124319.67 4748.91 2 江苏 JiangSu 122825.6 116314.2 6511.4 3 山东ShAnDong 87385 83045.9 4339.1 4 浙江…

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF 文章目录 GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHFPretraining 预训练阶段Supervised FineTuning (SFT&#x…

RT-DETR论文阅读笔记(包括YOLO版本训练和官方版本训练)

论文地址:RT-DETR论文地址 代码地址:RT-DETR官方下载地址 大家如果想看更详细训练、推理、部署、验证等教程可以看我的另一篇博客里面有更详细的介绍 内容回顾:详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署 目录 一…

从0开始学习JavaScript--构建强大的JavaScript图片库

在现代Web开发中,图像是不可或缺的一部分,而构建一个强大的JavaScript图片库能够有效地管理、展示和操作图像,为用户提供更丰富的视觉体验。本文将深入探讨构建JavaScript图片库的实用技巧,并通过丰富的示例代码演示如何实现各种功…

Spring Boot 项目配置文件出现乱码的解决方法

如下图,我们 Spring Boot 项目的配置文件 application.properties 可能会出现如下的乱码问题: 我们写注解的时候是正常的,但是下次启动项目就出现了乱码,这个是字符集设置的问题 解决方法 1.点击 File 选择 Settings 2.搜索 enco…

原神「神铸赋形」活动祈愿现已开启

亲爱的旅行者,「神铸赋形」活动祈愿现已开启,「单手剑静水流涌之辉」「法器碧落之珑」概率UP! 活动期间,旅行者可以在「神铸赋形」活动祈愿中获得更多武器与角色,提升队伍的战斗力! 〓祈愿时间〓 4.2版本更…

【研究中】sql server权限用户设置23.11.26

--更新时间2023.11.26 21:30 负责人:jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_user)--判断是否存在此表DROP TABLE hkcms_user CREATE TABLE hkcms_user (id int primary key identity(1, 1),username char(32) NOT N…

SpringCloud之Gateway(统一网关)

文章目录 前言一、搭建网关服务1、导入依赖2、在application.yml中写配置 二、路由断言工厂Route Predicate Factory三、路由过滤器 GatewayFilter案例1给所有进入userservice的请求添加一个请求头总结 四、全局过滤器 GlobalFilter定义全局过滤器,拦截并判断用户身…