• Nginx限流熔断


    一、Nginx限流熔断

    Nginx 是一款流行的反向代理和负载均衡服务器,也可以用于实现服务熔断和限流。通过使用 Nginx 的限流和熔断模块,比如:ngx_http_limit_req_module 和 ngx_http_limit_conn_module,可以在代理层面对服务进行限流和熔断。

    中文文档:https://nginx.cn/doc/index.html

    在这里插入图片描述
    针对高并发的场景。Nginx的限流主要是两种方式:

    • 限制访问频率
    • 限制并发连接数。

    二、限制请求访问频率

    Nginx中使用 ngx_http_limit_req_module模块来限制请求的访问频率,基于漏桶算法原理实现。

    使用 nginx的 limit_req_zone 和 limit_req 两个指令。

    1、基本语法

    limit_req_zone:限制单个IP的请求处理速率。

    基本语法:limit_req_zone key zone rate

    • key :定义限流对象,binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。
    • zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为10M,名字为myRateLimit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
    • rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。
    http {
    
        # 请求限流定义1:
        # - $binary_remote_addr:限制对象(客户端)
        # - zone:定义限制(策略)名称
        # - 10m:用十兆空间记录访问次数
        # - rate:每秒10次的请求处理速率
        limit_req_zone $binary_remote_addr zone={limits-name}:10m rate=10r/s;
        
        # 请求限流定义2:
        # - $server_name:限制对象,对指定服务器请求的限制
        limit_req_zone $server_name zone={limits-name}:10m rate=10r/s;
                    
        server {
            location /search/ {
                # 引用以上定义的限流策略,做以下设定(漏桶方式)
                # - burst:最多接收6个排队用户IP(从0开始计数),处于等待处理状态(容量)
                # - nodelay:超出排队之外的更多请求,拒绝并返回503(溢出)
                limit_req zone={limits-name} [burst=5] [nodelay];
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    针对流量突然增大,超出的请求无法处理时,可以通过 Nginx提供的 burst 参数来解决突发流量的问题,并结合 nodelay 参数一起使用。

    • burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数。
    • nodelay:超出排队之外的更多请求,拒绝并返回503(溢出)

    2、实例

    第一步:修改Nginx的配置文件

    http {
        # 请求限流定义:
        limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=1r/s;
    
        server {
        	 listen       80;
    			 server_name  192.168.xxx.xxx;  # 指定虚拟主机的IP,或者外网域名
        
        	 location / {
        		  root   html;
              index  index.html index.htm; 
        		  
           		proxy_pass  http://192.168.xxx.xxx:8080;
          	  limit_req zone=myRateLimit  burst=5  nodelay;
        	 }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    第二步:重启Nginx

    修改 nginx完之后,保存退出,重启Nginx

    # 先执行停止命令再执行启动命令
    [root@centos7 sbin]# /usr/local/nginx/sbin/nginx -s quit
    [root@centos7 sbin]# /usr/local/nginx/sbin/nginx
    
    • 1
    • 2
    • 3

    第三步: 浏览器快速访问

    在这里插入图片描述

    二、限制并发连接数

    Nginx 的 ngx_http_limit_conn_module模块提供了对资源连接数进行限制的功能。

    使用 limit_conn_zone 和 limit_conn 两个指令。

    1、基本语法

    http_limit_conn:单个IP同时允许的连接限制。

    http {
        
        # 连接限流定义1:
        # - $binary_remote_addr:限制对象(客户端)
        # - zone:限制自定义名称
        # - 10:内存中用10兆空间存储连接记录
        limit_conn_zone $binary_remote_addr zone={limits-name}:10m;
    
        # 请求限流定义2:
        # - $server_name:限制对象,对指定服务器请求的限制
        limit_conn_zone $server_name zone={limits-name}:10m;
                    
        server {
            location /search/ {
                
                # 限制单个IP同时允许建立多少连接(并发限制)
                limit_conn {limits-name} 1;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2、实例

    第一步:修改Nginx的配置文件

    http {
        # 请求限流定义:
        limit_conn_zone $binary_remote_addr zone=myConnLimit:10m;
    
        server {
        	 listen       80;
    			 server_name  192.168.xxx.xxx;  # 指定虚拟主机的IP,或者外网域名
        
        	 location / {
        		  root   html;
              index  index.html index.htm; 
        		  
           		proxy_pass  http://192.168.xxx.xxx:8080;
              # 限制单个IP同时允许建立5个连接
          	  limit_conn zone=myConnLimit 5;
        	 }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    第二步:重启Nginx

    修改 nginx完之后,保存退出,重启Nginx。

    # 先执行停止命令再执行启动命令
    [root@centos7 sbin]# /usr/local/nginx/sbin/nginx -s quit
    [root@centos7 sbin]# /usr/local/nginx/sbin/nginx
    
    • 1
    • 2
    • 3

    第三步: 浏览器快速访问

    在这里插入图片描述

    – 求知若饥,虚心若愚。

  • 相关阅读:
    linux配置静态ip ip和网关不在同一个网段
    动态规划 台阶问题四(爱思创)
    [intigriti 2023] 部分题
    网络基础(一)
    【2023集创赛】加速科技杯三等奖作品:私密性高精度刷手身份认证系统
    如何判断一个公司是否为空壳公司
    MySQL知识笔记——中级进阶之索引(实施工程师和DBA工作笔记)
    W5100S-EVB-PICO主动PING主机IP检测连通性(十)
    IDEA社区版(Community Edition)创建Springboot-Web项目,Java
    微服务探索之路06篇k8s配置文件Yaml部署Redis使用Helm部署MongoDB和kafka
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/133554410