0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅入深讲解Nginx限流相关配置

马哥Linux运维 来源:cnblogs 2024-04-29 11:24 次阅读

本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充。

Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读。不过不了解此算法,不影响阅读本文。

空桶

我们从最简单的限流配置开始:

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
    location /login/ {
        limit_req zone=ip_limit;
        proxy_pass http://login_upstream;
    }
}

$binary_remote_addr 针对客户端ip限流;

zone=ip_limit:10m 限流规则名称为ip_limit,允许使用10MB的内存空间来记录ip对应的限流状态;

rate=10r/s 限流速度为每秒10次请求

location /login/ 对登录进行限流

限流速度为每秒10次请求,如果有10次请求同时到达一个空闲的nginx,他们都能得到执行吗?

fd91cb88-054e-11ef-a297-92fbcf53809c.png

漏桶漏出请求是匀速的。10r/s是怎样匀速的呢?每100ms漏出一个请求。

在这样的配置下,桶是空的,所有不能实时漏出的请求,都会被拒绝掉。

所以如果10次请求同时到达,那么只有一个请求能够得到执行,其它的,都会被拒绝。

这不太友好,大部分业务场景下我们希望这10个请求都能得到执行。

Burst

我们把配置改一下,解决上一节的问题

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
    location /login/ {
        limit_req zone=ip_limit burst=12;
        proxy_pass http://login_upstream;
    }
}

burst=12 漏桶的大小设置为12

fda45f32-054e-11ef-a297-92fbcf53809c.png

逻辑上叫漏桶,实现起来是FIFO队列,把得不到执行的请求暂时缓存起来。

这样漏出的速度仍然是100ms一个请求,但并发而来,暂时得不到执行的请求,可以先缓存起来。只有当队列满了的时候,才会拒绝接受新请求。

这样漏桶在限流的同时,也起到了削峰填谷的作用。

在这样的配置下,如果有10次请求同时到达,它们会依次执行,每100ms执行1个。

虽然得到执行了,但因为排队执行,延迟大大增加,在很多场景下仍然是不能接受的。

NoDelay

继续修改配置,解决Delay太久导致延迟增加的问题

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
    location /login/ {
        limit_req zone=ip_limit burst=12 nodelay;
        proxy_pass http://login_upstream;
    }
}

nodelay 把开始执行请求的时间提前,以前是delay到从桶里漏出来才执行,现在不delay了,只要入桶就开始执行

fdb33a16-054e-11ef-a297-92fbcf53809c.png

要么立刻执行,要么被拒绝,请求不会因为限流而增加延迟了。

因为请求从桶里漏出来还是匀速的,桶的空间又是固定的,最终平均下来,还是每秒执行了5次请求,限流的目的还是达到了。

但这样也有缺点,限流是限了,但是限得不那么匀速。以上面的配置举例,如果有12个请求同时到达,那么这12个请求都能够立刻执行,然后后面的请求只能匀速进桶,100ms执行1个。如果有一段时间没有请求,桶空了,那么又可能出现并发的12个请求一起执行。

大部分情况下,这种限流不匀速,不算是大问题。不过nginx也提供了一个参数才控制并发执行也就是nodelay的请求的数量。

limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
    location /login/ {
        limit_req zone=ip_limit burst=12 delay=4;
        proxy_pass http://login_upstream;
    }
}

delay=4 从桶内第5个请求开始delay

fdbc257c-054e-11ef-a297-92fbcf53809c.png

这样通过控制delay参数的值,可以调整允许并发执行的请求的数量,使得请求变的均匀起来,在有些耗资源的服务上控制这个数量,还是有必要的。

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4612

    浏览量

    92926
  • nginx
    +关注

    关注

    0

    文章

    150

    浏览量

    12178

原文标题:Nginx限速模块大揭秘

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    的介绍BLE与MEMS中的开发板设计

    当BLE遇到MEMS,就如同天使有了翅膀。本期从有的介绍BLE与MEMS的那些事,就从ST的STEVA
    的头像 发表于 03-31 08:44 9104次阅读

    Linux运维Nginx软件优化之日志优化

    1. 配置Nginx服务相关日志操作1) 进行日志的切割[code][root@oldboy ~]# mkdir /server/scripts/ -p[root@oldboy ~]# cd
    发表于 12-18 15:17

    nginx中的sendfile配置说明

    nginx配置sendfile及详细说明
    发表于 05-05 08:08

    Centos7Nginx安装与配置步骤

    Centos7 Nginx安装与配置,防火墙开启端口监听
    发表于 06-02 12:58

    请问哪位大神可以详细介绍JavaScript拷贝和拷贝?

    JavaScript数据类型JavaScript拷贝和拷贝
    发表于 11-05 07:16

    nginx错误页面配置

    16、nginx 错误页面配置nginx错误页面包括404 403 500 502 503 504等页面,只需要在server中增加以下配置即可: error_page404 403
    发表于 07-26 06:54

    主要学习下nginx的安装配置

    主要学习下nginx的安装配置,以便于后续学习。以下在本地虚拟机上搭建学习。1、检查系统网络是否能连通公网:ping www.taobao.com2、确认yum源是否配置好,用于下载安装环境基础包
    发表于 10-19 14:12

    RF工程师必须掌握的内容:从解说S参数

    RF工程师必须掌握的内容:从解说S参数。
    的头像 发表于 03-01 10:34 1.1w次阅读
    RF工程师必须掌握的内容:从<b class='flag-5'>浅</b><b class='flag-5'>入</b><b class='flag-5'>深</b>解说S参数

    运行nginx所需的最低配置

    运行nginx所需的最低配置: # /etc/nginx/nginx.confevents {} # event context have to be defined to consi
    的头像 发表于 08-23 10:53 5512次阅读

    限流方案常用算法 常用的限流方案

    需要注意的是借助Redis实现的限流方案可用于分布式系统,而guava实现的限流只能应用于单机环境。如果你觉得服务器端限流麻烦,可以在不改任何代码的情况下直接使用容器限流
    发表于 04-08 10:50 424次阅读

    Nginx常用的配置和基本功能讲解

    Nginx 已经广泛应用于 J-one 和 Jdos 的环境部署上,本文对 Nginx 的常用的配置和基本功能进行讲解,适合 Nginx
    的头像 发表于 05-04 10:25 675次阅读

    C++拷贝和拷贝详解

    当类的函数成员存在指针成员时会产生拷贝和拷贝和问题。
    发表于 08-21 15:05 334次阅读
    C++<b class='flag-5'>深</b>拷贝和<b class='flag-5'>浅</b>拷贝详解

    Nginx的特点和作用 Nginx常用命令和核心配置

    更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。
    的头像 发表于 09-01 09:53 726次阅读
    <b class='flag-5'>Nginx</b>的特点和作用 <b class='flag-5'>Nginx</b>常用命令和核心<b class='flag-5'>配置</b>

    Nginx常用配置与命令

    对于前端来说 Node.js 并不陌生, Nginx 和 Node.js 的很多理念类似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.j
    发表于 10-18 10:04 452次阅读
    <b class='flag-5'>Nginx</b>常用<b class='flag-5'>配置</b>与命令

    nginx负载均衡配置介绍

    目录 nginx负载均衡 nginx负载均衡介绍 反向代理与负载均衡 nginx负载均衡配置 Keepalived高可用nginx负载均衡器
    的头像 发表于 11-10 13:39 248次阅读
    <b class='flag-5'>nginx</b>负载均衡<b class='flag-5'>配置</b>介绍