• 使用Nginx来实现限流


    前言

    在之前的篇章中,我们谈到了限流的解决方案之一,使用网关进行限流的解决方案,而在众多的网关中,Nginx作为一款高性能、轻量级的组件,也提供了强大的可以配置的限流功能。

    环境准备

    首先在linux 上安装 nginx,nginx的安装请参考本文作者的其他文章 nginx 在 linux 下的安装
    然后启动nginx后如下图所示,说明安装Nginx 成功在这里插入图片描述
    我在这个nginx 上映射了外网的IP,并配置了
    在这里插入图片描述
    配置后访问如下图
    在这里插入图片描述

    Nginx 限流的配置

    - IP 限流配置

    	#根据IP地址限流
        # 1) remote_addr,表示通过IP地址进行限流
        # 2)iplimit,指定一块内存区域大小为20M,名字为iplimit,用于记录访问的频率信息
        # 3)rate=1r/s,表示每秒放行一个请求,可以根据业务需求指定【标识访问的限流频率】
     limit_req_zone $binary_remote_addr zone=iplimit:20m rate=1r/s ;
        server {
            listen       80;
            #listen       443 ssl http2;
            server_name  _;
            #ssl_certificate      /usr/local/srs/conf/server.crt;
            #ssl_certificate_key  /usr/local/srs/conf/server.key;
            # For SRS homepage, console and players
            #   http://r.ossrs.net/console/
            #   http://r.ossrs.net/players/
            location / {
               proxy_pass http://127.0.0.1:8080/;
            }
            # For SRS streaming, for example:
            #   http://r.ossrs.net/live/livestream.flv
            #   http://r.ossrs.net/live/livestream.m3u8
            location ~ /.+/.*\.(flv|m3u8|ts|aac|mp3)$ {
               proxy_pass http://127.0.0.1:8080$request_uri;
            }
            # For SRS backend API for console.
            location /api/ {
               proxy_pass http://127.0.0.1:1985/api/;
                 #基于IP地址的限制
                #1) limit_req zone --->引用 上面limit_req_zone的zone配置
                #2) burst 设置一个缓冲区域,当大量请求过来,即请求数量超过限流频率时,放入缓冲区域,这里可以缓冲2个请求
                #3) nodelay 当缓冲区域放满了,直接返回503异常
                limit_req zone=iplimit burst=2 nodelay;
            }
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    添加完毕,使用命令 nginx -s reload重启下nginx服务,从上面的配置和注释可以看到,这里是配置了基于Ip的访问限制,即每秒允许一个请求通过,我们想象下当请求超过这个频率时就会有503的提醒,如下图片
    在这里插入图片描述
    这样配置就完成了ip限流的配置,总结起来,基于IP进行限流的方式应该说比较常规而且也是很实用的一种方式,直接全局生效,任何一个IP请求访问过来,超过了请求的频率就立即生效。

    - nginx 基于service 的限流
    紧接着,我们基于上面的IP限流,继续添加基于服务器(server)级别的限流,这里要说明一点,nginx中的限流规则维度可以配置多个,共同生效,大家可以类比木桶理论,以最短的那片为木桶的瓶颈,同样限流规则也是如此,以最先触发的那个策略开始生效,我们直接追加新的配置,参考注释说明。
    配置如下:

           #根据IP地址限流
        # 1) remote_addr,表示通过IP地址进行限流
        # 2)iplimit,指定一块内存区域大小为20M,名字为iplimit,用于记录访问的频率信息
        # 3)rate=1r/s,表示每秒放行一个请求,可以根据业务需求指定【标识访问的限流频率】
    
        limit_req_zone $binary_remote_addr zone=iplimit:20m rate=10r/s ;
    
        #服务器级别限流,即对同一个服务器发来的请求,对此服务器进行限流
        limit_req_zone $server_name zone=server_limit:10m rate=1r/s ;
    
        server {
            listen       80;
            #listen       443 ssl http2;
            server_name  _;
            location / {
               proxy_pass http://127.0.0.1:8080/;
            }
            # For SRS backend API for console.
            location /api/ {
               proxy_pass http://127.0.0.1:1985/api/;
                 #基于IP地址的限制
                #1) limit_req zone --->引用 上面limit_req_zone的zone配置
                #2) burst 设置一个缓冲区域,当大量请求过来,即请求数量超过限流频率时,放入缓冲区域,这里可以缓冲2个请求
                #3) nodelay 当缓冲区域放满了,直接返回503异常
                limit_req zone=iplimit burst=2 nodelay;
    
                #服务器级别限流
                #通常情况下,server级别的限流树比IP级别的要大一些
                limit_req zone=server_limit burst=1 nodelay;
            }
            # For SRS WebRTC publish/play API.
            location /rtc/ {
               proxy_pass http://127.0.0.1:1985/rtc/;
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    为了模拟出效果,我们将1和2的配置先注释掉,并且在后台接口服务中添加一个接口,这个接口中,人为的将处理时间调大,模拟增大connection的时间。
    效果如下图
    在这里插入图片描述

    - nginx基于连接数的限流
    基于连接数的限制,可以理解成对于某个IP,在指定的时间内,只允许你有指定数量的连接接入进来,对于某个server,在指定的时间内,只允许你这台server最多保持指定数量的连接接入,请参考下面的配置3及注释说明。

    	#   1、根据IP地址限流
        #       1) remote_addr,表示通过IP地址进行限流
        #       2)iplimit,指定一块内存区域大小为20M,名字为iplimit,用于记录访问的频率信息
        #       3)rate=1r/s,表示每秒放行一个请求,可以根据业务需求指定【标识访问的限流频率】
    
        #limit_req_zone $binary_remote_addr zone=iplimit:20m rate=1r/s ;
    
        #   2、服务器级别限流,即对同一个服务器发来的请求,对此服务器进行限流
        #limit_req_zone $server_name zone=server_limit:10m rate=10r/s ;
    
        #   3、基于连接数的限流配置,限制了IP地址级别的连接数,以及限制服务器server级别的连接数
        limit_conn_zone $binary_remote_addr zone=perip:20m ;
        limit_conn_zone $server_name zone=perserver:20m ;
    
        server {
            listen       80;
            #listen       443 ssl http2;
            server_name  _;
            location /rtc/ {
               proxy_pass http://127.0.0.1:1985/rtc/;
            }
    
                # 1、基于IP地址的限制
                #1) limit_req zone --->引用 上面limit_req_zone的zone配置
                #2) burst 设置一个缓冲区域,当大量请求过来,即请求数量超过限流频率时,放入缓冲区域,这里可以缓冲2个请求
                #3) nodelay 当缓冲区域放满了,直接返回503异常
                #limit_req zone=iplimit burst=2 nodelay;
    
                # 2、服务器级别限流
                #通常情况下,server级别的限流树比IP级别的要大一些
                #limit_req zone=server_limit burst=100 nodelay;
    
                # 3、连接数限制
                #每个server最多可以允许100个连接
                #每个IP地址最多允许一个连接
                limit_conn perserver 10;
                limit_conn perip 1;
    
                #配置限流时nginx的返回状态值
                limit_req_status 504;
    
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    当我们把这个挂起的时间调大到15秒时,开启2个窗口进行访问,发现由于我们的连接数设定的是1,这时候当第一个请求对应的IP占用了这个连接时,同一个IP再次过来访问的时候,nginx就直接限制了。

    在这里插入图片描述

    总结

    本篇主要介绍了如何使用Nginx配置应用的限流,主要介绍了常用的3种限流方式,在实际应用中可以基于其中的一种或者几种配合起来进行使用。

  • 相关阅读:
    今天不写代码,聊聊热门的知识图谱
    K8S安装过程十一:istio 服务网格与 Ingress 部署
    数字图像处理(2)像素邻域、领接、通路与距离
    【python】使用Nuitka打包python项目-demo示例
    debian11 安装 postgress 数据库 -- chatGPT
    塔望食观察 | 中国海参产业发展现状及挑战
    java计算机毕业设计基于安卓Android/微信小程序的校园跑腿代购 uni-app
    RFID技术助力智慧餐厅快速结算
    阿里云物联网平台搭建
    window11 设置 ubuntu2204 至最佳体验(安装/右键菜单/root用户/docker)
  • 原文地址:https://blog.csdn.net/houxian1103/article/details/127698076