nginx 实现网关限流之一 漏桶算法

漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

简单点就是 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。

1 ngx_http_limit_req_module模块

介绍

nginx自带的ngx_http_limit_req_module模块是对请求进行限流,即限制某一时间段内用户的请求速率;且使用的是漏桶算法;

 当用户请求时,会新增一条访问记录(主要记录访问计数、访问时间),以客户端IP地址(配置$binary_remote_addr)的hash值作为key存储在红黑树中(快速查找),同时存储在LRU队列中(存储空间不够时,淘汰记录,每次都是从尾部删除);当用户再次请求时,会从红黑树中查找这条记录并更新,同时移动记录到LRU队列首部;

访问记录的结构体
typedef struct {
    u_char                       color;
    u_char                       dummy;
    u_short                      len;    //数据长度
    ngx_queue_t                  queue; 
    ngx_msec_t                   last;   //上次访问时间 
    ngx_uint_t                   excess; //当前剩余待处理的请求数(nginx用此实现令牌桶限流算法)
    ngx_uint_t                   count;  //此类记录请求的总数
    u_char                       data[1];//数据内容(先按照key(hash值)查找,再比较数据内容是否相等)

}

2 使用

 

配置
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }

 

你可能感兴趣的:(nginx)