zoukankan      html  css  js  c++  java
  • 限流(四)nginx接入层限流

    一、nginx限流模块

    接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等。

    nginx中针对限流有两个模块可以处理:

    1)ngx_http_limit_req_module;连接数限流模块

    2)ngx_http_limit_conn_module;请求限流模块

    连接数限流模块是基于计数器方式实现的,请求限流模块是基于漏桶算法实现的;

    关于限流算法可以参考:https://www.cnblogs.com/lay2017/p/9060497.html

    除了以上两种,我们曾在分布式限流中提到nginx+lua方式来实现限流操作,只要集成一下lua模块。或者采用openresty,它自带了lua模块,可以实现复杂的限流场景。

    本文不涉及lua模块的部分,只是简单使用nginx默认自带的两个模块来实现限流操作。

    二、ngx_http_limit_conn_module

    连接数限流模块,和一般的计数器限流是一样的思路,通过一个key来存取对应的value,value表示请求的数量。比如:限制某个IP的总请求数量,那么我们只需要改变和存取该IP对应的请求数量即可。

    ngx_http_limit_conn_module限流模块使用代码如下:

    http{
        limit_conn_zone $binary_remote_addr zone=addr:10m;
        limit_conn_log_level error;
        limit_conn_status 503;
        ...
        server{
            ...
            location /limit{
                limit_conn addr 1;
                proxy_pass 'http:www.baidu.com';
            }    
        }  
    }

    以上代码:

    1)limit_conn:配置的是要存放KEY和计数器的共享内存区域(addr),并指定KEY的最大连接树木(这里是1)

    2) limit_conn_zone: 配置限流的KEY(这里是IP地址:$binary_remote_addr)、共享内存区域的大小(10m)。

    3) limit_conn_status: 配置限流以后返回的状态码;

    4)limit_conn_log_level: 配置限流以后的日志级别;

    5)proxy_pass: 返回代理的是百度的页面;

    我们通过测试工具测试1秒钟20个请求的结果: http://localhost/limit

    输出结果:

    有部分请求将被限流并返回结果503,而未被限流的则返回百度页面;

    三、ngx_http_limit_req_module

    请求限流模块实现的是漏桶算法,主要是对请求的速率进行限制。

    直接看具体代码:

    http {
        limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s;
        limit_conn_log_level error;
        limit_conn_status 503;
        ...
        server {
        ...
            location /limit {
                limit_req zone=addr burst=2 nodelay;
                proxy_pass: 'http://www.baidu.com';
            }
        }
    }

    1)limit_req:配置共享内存区域桶容量(突发容量,默认0)、是否延迟模式(默认延迟);

    2)limit_req_zone:配置限流KEY、及存放KEY对应信息的共享内存区域大小、固定请求速率;此处指定的KEY是“$binary_remote_addr”表示IP地址;固定请求速率使用rate参数配置,支持10r/s和60r/m,即每秒10个请求和每分钟60个请求,不过最终都会转换为每秒的固定请求速率(10r/s为每100毫秒处理一个请求;60r/m,即每1000毫秒处理一个请求)。

    3)limit_conn_status:配置被限流后返回的状态码,默认返回503;

    4)limit_conn_log_level:配置记录被限流后的日志级别,默认error级别。

    limit_req的主要执行过程如下所示:

    1、请求进入后首先判断最后一次请求时间相对于当前时间(第一次是0)是否需要限流,如果需要限流则执行步骤2,否则执行步骤3;

    2.1、如果没有配置桶容量(burst),则桶容量为0;按照固定速率处理请求;如果请求被限流,则直接返回相应的错误码(默认503);

    2.2、如果配置了桶容量(burst>0)且延迟模式(没有配置nodelay);如果桶满了,则新进入的请求被限流;如果没有满则请求会以固定平均速率被处理(按照固定速率并根据需要延迟处理请求,延迟使用休眠实现);

    2.3、如果配置了桶容量(burst>0)且非延迟模式(配置了nodelay);不会按照固定速率处理请求,而是允许突发处理请求;如果桶满了,则请求被限流,直接返回相应的错误码;

    3、如果没有被限流,则正常处理请求;

    4、Nginx会在相应时机进行选择一些(3个节点)限流KEY进行过期处理,进行内存回收。

    测试工具测试结果:

    配置zoneurst odelay的情况下,20r/1s测试结果为3个,理论上应该是2个成功,但是由于计算算法问题,首次会出现3个,不过可以忽略不计。其它则返回503错误

    参考文章:

    http://jinnianshilongnian.iteye.com/blog/2305117

  • 相关阅读:
    SQLSERVER调用DLL程序
    RAISERROR语句
    SQLSERVER表联结(INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN,CROSS JOIN,CROSS APPLY,OUTER APPLY)
    SQL Server在存储过程中编写事务处理代码的三种方法
    找出表中缺失的连续数据(如:2,4,7,9;需要找出:1,3,5,6,8的数据)
    sqlserver用于统计表索引情况
    你需要了解的HTTP协议
    自己实现一个类似 jQuery 的函数库
    JS 函数 学习笔记
    JS 数组 学习笔记
  • 原文地址:https://www.cnblogs.com/lay2017/p/9114475.html
Copyright © 2011-2022 走看看