nginx 接入层限流

1.nginx 接入层限流

对于Nginx接入层限流可以使用Nginx自带的两个模块:连接数限制模块(ngx_http_limit_conn_module和 漏桶算法实现的请求限流模块ngx_http_limit_req_module。
limit_conn用来对某个key对应的总的网络连接数进行限流,可以按照IP、域名维度进行限流。limit_req用来对某个key对应的请求的平均速率进行限流,两种方法:

  • 平滑模式(delay):
  • 允许突发模式(nodelay)

1.1 ngx_http_limit_conn_module

limit_conn 是对某个key对应的总的网络连接数进行限流。可以按照IP来限制IP维度的总连接数,或者按照服务域名 来限制某个域名的总连接数。
该模块提供了两个配置参数,liit_conn_zone 和 limit_conn,其中limit_conn_zone 只能配置在http{}段,而limit_conn则可以配置与http{},server{},location{}区段中。

1.1.1 第三方模块编译安装参数:
# ./configure –prefix=/usr/local/nginx –-add-module=./nginx_limit_speed_module-master
# make
输入make进行编译,千万不要make install 因为会覆盖原来已经安装好的内容,另外,编译必须没错误才行。
输入 /usr/local/nginx/sbin/nginx -V,查看ngx_cache_purge是否安装成功。
1.1.2 ngx_http_limit_req_module模块指令
1.1.2.1 limit_req_zone

语法:limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
说明:
- $variable 定义键
- zone=name 定义区域名称,后面的limit_conn指令会使用到
- size: 定义各个键共享内存空间大小
例:

limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s;

客户端的IP地址作为键。注意 使用的是binary_remote_addr 变量,而不是 r e m o t e a d d r remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
- $binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。

1.1.2.2 limit_conn_log_level

语法: limit_conn_log_level info | notice | warn | error
默认值: error
配置段:http,server,location
当达到最大限制连接数后,记录日志的等级。

1.1.2.3 limit_conn

语法: limit_conn zone_name number
默认值: none
配置段: http,server,location
指定每个给定键值的最大同时连接数,当超过这个数字时被返回503.如

limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
    location /www.ttlsa.com/ {
        limit_conn addr 1;
    }
}

同一IP同一时间只允许有一个连接
当多个 limit_conn 指令被配置时,所有的连接数限制都会生效。比如,下面配置不仅会限制单一IP来源的连接数,同时也会限制单一虚拟服务器的总连接数:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
    limit_conn perip 10;
    limit_conn perserver 100;
}
1.1.2.4 limit_conn_status

语法: limit_conn_status code;
默认值: limit_conn_status 503;
配置段: http, server, location

该指定在1.3.15版本引入的。指定当超过限制时,返回的状态码。默认是503。

1.1.2.5 limit_rate

语法: limit_rate rate
默认值:0
配置段 :http, server, location, if in location
对每个连接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。

1.1.2.6 完成实例版
http {
 limit_conn_zone $binary_remote_addr zone=limit:10m;
 limit_conn_log_level info;

 server {
 location  ^~ /download/ {  
     limit_conn limit 4;
     limit_rate 200k;
                }
 }
}
1.1.2.7 limit_conn执行流程

1、请求进入后首先判断当前limit_conn_zone中相应key的连接数是否超出配置的最大连接数
2、如果超过了配置的最大大小,则被限流,返回limit_conn_status定义的错误状态码。否则相应的key的连接数加1,并注册请求处理完成的回调函数。
3、进行请求处理
4、在技术请求阶段调用注册的回调函数对相应 key的连接数减1。

1.2 ngx_http_limit_req_module

limit_req 是 漏桶算法实现,对于 指定的key对应的请求进行限流,比如:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    ...
    location /limit {
        limit_req zone=one burst=5 nodelay;
    }

参数说明:

limit_req_zone:

  • $binary_remote_addr 表示通过remote_addr和这个标识来做限制,此处的key表示IP地址。
  • zone=one:10m 表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
  • rate: 固定请求 速率使用rate参数配置,支持10r/s和60r/m,即每秒10个请求和每分钟60个请求。不过最终都会转换为每秒的固定请求速率。

limit_req:

  • zone=one 设置使用哪个配置区来做限制,与上面limit_req_zone里的 name对应
  • burst: 设置一个大小为5的缓冲区,当有大量请求过来时,超过访问频次限制的请求可以先发昂达哦这个缓冲区中
  • nodelay : 如果设置,超过该访问 频次 而且缓冲区也满了的时候 就会直接返回503,如果没有设置,则所有请求会等待排队

limit_req的主要执行过程如下

  • 请求进入后首先判断最后一次请求时间相对于当前时间(第一次是0)是否主要限流,如果需要限流,则执行步骤2,否则执行步骤3。
  • 如果没有配置桶容量(burst),则桶容量 为0,按照固定速率处理请求。如果请求被限流,则直接返回响应的错误码(默认为503)。
    如果配置了桶容量(burst>0)及延迟模式,如果桶慢了,则新进入的请求被限流。如果没有满,则请求会以固定平均速率被处理。
    如果配置了桶容量(burst>0)及非延迟模式,则不会按照固定速率处理请求,而是 允许突发处理请求。如果桶满了,则请求被限流,直接 返回相应的错误码。
  • 如果没有被限流,则正常处理

猜你喜欢

转载自blog.csdn.net/fd2025/article/details/80505225