连接限制#

该模块用于根据定义的键限制连接数量,特别是限制来自单个IP地址的连接数量。

并不是所有的连接都会被计数。只有当连接的请求正在被服务器处理且整个请求头已经被读取时,该连接才会被计数。

配置示例#

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

    ...

    server {

        ...

        location /download/ {
            limit_conn addr 1;
        }

指令#

limit_conn#

语法

limit_conn zone number;

默认值

上下文

http, server, location

设置共享内存区域和给定键值允许的最大连接数。当超过此限制时,服务器将返回 错误 作为请求的响应。例如,以下指令

limit_conn_zone $binary_remote_addr zone=addr:10m;

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

允许每次一个IP地址只有一个连接。

备注

在HTTP/2和SPDY中,每个并发请求被视为一个单独的连接。

可以有多个 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_dry_run#

语法

limit_conn_dry_run on | off;

默认值

limit_conn_dry_run off;

上下文

http, server, location

启用试运行模式。在此模式下,连接数量不受限制,但在 共享内存区域 中,过多的连接数量仍被正常计数。

limit_conn_log_level#

语法

limit_conn_log_level info | notice | warn | error;

默认值

limit_conn_log_level error;

上下文

http, server, location

设置当服务器限制连接数量时所需的日志记录级别。

limit_conn_status#

语法

limit_conn_status code;

默认值

limit_conn_status 503;

上下文

http, server, location

设置对被拒绝请求返回的状态码。

limit_conn_zone#

语法

limit_conn_zone key zone = name:size;

默认值

上下文

http

为共享内存区域设置参数,该区域将保存各种键的状态。特别是,状态包括当前连接数。键可以包含文本、变量及其组合。空键值的请求不计数。

使用示例:

limit_conn_zone $binary_remote_addr zone=addr:10m;

在这里,客户端IP地址作为键。注意,这里使用的是 $binary_remote_addr 变量,而不是 $remote_addr

$remote_addr 变量的大小可以从7到15字节变化。在32位平台上,存储的状态占用32或64字节内存,在64位平台上始终占用64字节。

$binary_remote_addr 变量的大小对于IPv4地址始终为4字节,对于IPv6地址为16字节。在32位平台上,存储的状态始终占用32或64字节内存,在64位平台上占用64字节。

一个兆字节的区域可以保存大约32,000个32字节状态或大约16,000个64字节状态。如果区域存储耗尽,服务器将对所有后续请求返回 错误

内置变量#

$limit_conn_status#

保存限制连接数的结果:PASSEDREJECTEDREJECTED_DRY_RUN