首页 > 系统相关 >nginx: 按ip地址限流

nginx: 按ip地址限流

时间:2024-09-21 15:01:31浏览次数:8  
标签:请求 zone ip req nginx rate 限流 limit test

一,以固定的速度提供服务

语法:

例子

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

server {    location / {        limit_req zone=test;    }}

语法:

imit_req_zone 用于设置限流和共享内存区域的参数,格式为:

limit_req_zone key zone rate。

key: 定义限流对象,
        $binary_remote_addr 是 nginx 中的变量,表示基于 remote_addr(客户端IP) 来做限流。

zone: 定义共享内存区来存储访问信息,
           访问信息包括每个 IP 地址状态和访问受限请求 URL 的频率等 
           zone 的定义分为两个部分:由 zone= 关键字标识的区域名称,以及冒号后面的区域大小。
           test:10m 表示一个大小为10M,名字为 test 的内存区域。
           1M 能存储16000个 IP 地址的访问信息,test 大概可以存储约160000个地址。
          nginx 创建新记录的时候,会移除前60秒内没有被使用的记录,
         如果释放的空间还是存储不了新的记录,会返回503的状态码。

rate: 设置最大的访问速率。
          rate=2r/s(为了好模拟,rate 设置的值比较小),表示每秒最多处理 2个请求。
         事实上 nginx 是以毫秒为粒度追踪请求的,rate=2r/s 实际上是每500毫秒1个请求,
         即,上一个请求完成后,如果500毫秒内还有请求到达,这些请求会被拒绝
      (默认返回503,如果想修改返回值,可以设置limit_req_status)

limit_req_zone 只是设置限流参数,如果要生效的话,必须和 limit_req 配合使用。
limit_req 的格式为:

limit_req zone=name [burst=number] [nodelay]

 

上面的配置保证了 nginx 以固定的速度提供服务(2r/s),但是这种情况不适用于有突发流量的情况,
我们希望可以尽可能的缓存请求并处理它们

二,增加队列

例子:

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
server {    location / {        limit_req zone=test burst=5;    }}

burst 表示在超过设定的访问速率后能额外处理的请求数。
        当 rate=2r/s 时,表示每500ms 可以处理一个请求。
        burst=5时,如果同时有10个请求到达,nginx 会处理第1个请求,
                        剩余9个请求中,会有5个被放入队列,剩余的4个请求会直接被拒绝。
                        然后每隔500ms从队列中获取一个请求进行处理,
                        此时如果后面继续有请求进来,如果队列中的请求数目超过了5,会被拒绝,
                        不足5的时候会添加到队列中进行等待。
                        我们可以理解为现在的桶可以存5滴水:

三,让队列中请求无需等待:

配置 burst 之后,虽然同时到达的请求不会全部被拒绝,
但是仍需要等待500ms 一次的处理时间,放入桶中的第5个请求需要等待500ms * 4的时间才能被处理,
更长的等待时间意味着用户的流失,在许多场景下,这个等待时间是不可接受的。
此时我们需要增加 nodelay 参数,和 burst 配合使用。

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

server { location / { limit_req zone=test burst=5 nodelay; }}

nodelay 表示不延迟。设置 nodelay 后,第一个到达的请求和队列中的请求会立即进行处理,不会出现等待的请求。

需要注意的是,
虽然队列中的5个请求立即被处理了,但是队列中的位置依旧是按照500ms 的速度依次被释放的。
后面的4个请求依旧是被拒绝的,长期来看并不会提高吞吐量的上限,
长期吞吐量的上限是由设置的 rate 决定的。

说明:
参考自:
https://blog.csdn.net/cold___play/article/details/132094865

 

标签:请求,zone,ip,req,nginx,rate,限流,limit,test
From: https://www.cnblogs.com/architectforest/p/18424026

相关文章

  • ReactJS + Stripe:试用期天数未按预期工作
    :试用期天数未按预期工作一、问题描述(一)预期的试用期天数该应用程序使用ReactJS和Stripe进行支付处理。试用期天数应设置为14天,但实际试用期天数并未按预期工作。用户在注册后,试用期仅持续了7天,而不是预期的14天。这导致用户在试用期结束前就被要求支付订阅费用,给用户带来......
  • 使用 Nginx 搭建 Webdav 服务
    使用Nginx搭建Webdav服务一、自签名根证书1.生成根证书密钥opensslgenrsa-out./root.key20482.生成根证书opensslreq-x509-new-key./root.key-out./root.pem-days365交互信息CountryName(2lettercode)[]:CNStateorProvinceName(fullname)......
  • WPF Canvas show custom control with ellipse filled with image and text,peridoica
    //customcontrol<UserControlx:Class="WpfApp389.ElpImageTbk"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"......
  • 如何查看linux上对应的dhcp服务器IP是多少
    如何查看linux上对应的dhcp服务器IP是多少要查看Linux系统上对应的DHCP服务器IP地址,可以通过以下几种方法:1.检查DHCP客户端日志在DHCP客户端获取IP地址的过程中,DHCP服务器的IP地址通常会记录在系统日志中。可以使用grep命令查找包含"DHCPOFFER"的日志条......
  • Nginx配置详解
    #nginx进程数,建议设置为等于CPU总核心数。worker_processes1;#事件区块开始events{#单个进程最大连接数(最大连接数=连接数*进程数)#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连......
  • 新手爬虫er必刷!如何使用代理IP全攻略!
    在爬虫开发中,代理IP(也称为代理服务器)是一个非常重要的工具。当爬虫访问网站时,可能会遭遇IP封锁或请求频率限制。通过使用代理IP,可以分散请求压力并规避特定对IP的限制,从而提高采集任务的持续性。同时,不同的IP地址让爬虫在网络上显示为不同的位置来源,避免单一IP的频繁请求导致被目......
  • 3.4.4 __ipipe_init_early之再论虚拟中断
    点击查看系列文章=》 InterruptPipeline系列文章大纲-CSDN博客3.4.4__ipipe_init_early之再论虚拟中断     根据《3.4.1.2IPIPE对Linux中断号的改造》的分析,IPIPE引入的虚拟中断virtualinterrupt的概念,其中前10个虚拟中断本质上是利用SGI实现的IPI中断。IPIPE在......
  • JavaScript 基础 - 第20天_Node.js入门
    文章目录Day01_Node.js入门提前安装软件目录学习目标01.什么是Node.js目标讲解小结02.fs模块-读写文件目标讲解小结03.path模块-路径处理目标讲解小结04.案例-压缩前端html目标讲解小结05.案例-压缩前端JS目标讲解小结06.认识URL中的端口号目标讲解小结07.http模......
  • 芝麻代理、快代理、神龙代理、巨量代理、站大爷…代理IP那么多,要怎么挑?
    逛乎,一直刷到这类问题:本质上,都是在面对市面上那么多代理IP服务提供商,挑得眼花缭乱了,而代理IP直接影响到我们数据采集任务的效率、安全性和成功率,所以我们在挑选服务提供商的时候都会谨慎一些。索性我们今天来说一下,如何找到适合我们项目的代理IP服务。代理IP应当怎么选?1.明确自身需......
  • Python 中的 strip() 和 split() 方法详解
    目录一、strip()方法1.什么是strip()?2.基本语法3.基本用法示例1)去除空白字符2)移除指定字符4.lstrip()和rstrip()5.注意事项二、split()方法1.什么是split()?2.基本语法3.基本用法示例1)按空格分割字符串2)指定分隔符3)限制分割次数4.rsplit()方法......