Nginx http_limit_conn模块详解

简介

ngx_http_limit_conn_module 对于一些服务器流量异常、负载过大,甚至是大流量的恶意攻击访问等,进行并发数的限制。

该模块可以根据定义的键来限制每个键值的连接数,特别的,可以设定单一 IP 来源的连接数。

并不是所有的连接都会被模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。

该模块提供了两个配置参数,limit_conn_zone 和 limit_conn ,其中 limit_conn_zone 只能配置在 http{} 段,而 limit_conn 则可以配置于http{},server{},location{} 区段中。

官方英文文档: http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

配置示例

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    
    ...
    
    server {

        ...

        location /download/ {
            limit_conn addr 1;
        }
    }
}

表示,同一 IP 同一时间只允许有一个连接。

基本指令

limit_conn_zone

语法

limit_conn_zone $variable zone=name:size;

配置段:http

该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值不会被考虑)。$variable 定义键,zone=name 定义区域名称,主要作用与后面的 limit_conn。size 定义各个键共享内存空间大小。

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

limit_conn

语法

limit_conn zone_name number;

配置段:http,server,location

该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有20个连接)

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    location /download/ {
        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;
}

如果当前配置层级没有limit_conn指令,将会从更高层级继承连接限制配置。

limit_conn_status

语法

limit_conn_status code;

默认值: limit_conn_status 503;

配置段: http, server, location

指定当超过限制时,返回的状态码。默认是503。

limit_conn_log_level

语法

limit_conn_log_level info | notice | warn | error;

默认值:limit_conn_log_level error;

配置段:http, server, location

指定当连接数超过设定的最大连接数,服务器限制连接时的日志等级。

limit_conn_dry_run

语法

limit_conn_dry_run on | off;

默认值:limit_conn_dry_run off;

配置段:http, server, location

启用空运行模式。在此模式下,连接数不受限制,但是,在共享内存区域中,过多连接的数将照常计算。

limit_rate

语法:

limit_rate rate;

默认值:0

配置段:http, server, location, if in location

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