<!-- review: finished -->

<a id="http-limit-conn"></a>

# Limit Conn

该模块用于限制每个定义的关键字的连接数量，特别是来自单个 IP 地址的连接数量。

并非所有连接都会被计数。仅在请求被服务器处理且整个请求头已被读取的情况下，才会计数连接。

<a id="configuration-example-25"></a>

## 配置示例

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

    ...

    server {

        ...

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

<a id="directives-26"></a>

## 指令

<a id="index-0"></a>

<a id="limit-conn-1"></a>

### limit_conn

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_conn` zone number;   |
|--------------------------------------------------------------------------------------|-----------------------------|
| 默认                                                                                   | —                           |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location      |

为给定的键值设置共享内存区和最大允许的连接数。当超过此限制时，服务器将返回 [错误](#limit-conn-status) 作为请求的回复。例如，以下指令

```nginx
limit_conn_zone $binary_remote_addr zone=addr:10m;

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

仅允许每个 IP 地址同时建立一个连接。

#### NOTE
在 HTTP/2 和 HTTP/3 中，每个并发请求被视为一个单独的连接。

可以有多个 `limit_conn` 指令。例如，以下配置将限制每个客户端 IP 地址对服务器的连接数量，同时限制对虚拟服务器的总连接数量：

```nginx
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` 指令时，从上一级配置级别继承。

<a id="index-1"></a>

<a id="limit-conn-dry-run"></a>

### limit_conn_dry_run

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_conn_dry_run` `on` | `off`;   |
|--------------------------------------------------------------------------------------|--------------------------------------|
| 默认                                                                                   | `limit_conn_dry_run off;`            |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location               |

启用干运行模式。在此模式下，连接数量没有限制，但是在 [共享内存区](#limit-conn-zone) 中，超出连接的数量仍然会被正常统计。

<a id="index-2"></a>

<a id="limit-conn-log-level"></a>

### limit_conn_log_level

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_conn_log_level` `info` | `notice` | `warn` | `error`;   |
|--------------------------------------------------------------------------------------|----------------------------------------------------------------|
| 默认                                                                                   | `limit_conn_log_level error;`                                  |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                                         |

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

<a id="index-3"></a>

<a id="limit-conn-status"></a>

### limit_conn_status

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_conn_status` code;   |
|--------------------------------------------------------------------------------------|-----------------------------|
| 默认                                                                                   | `limit_conn_status 503;`    |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location      |

设置对被拒绝请求的响应状态码。

<a id="index-4"></a>

<a id="limit-conn-zone"></a>

### limit_conn_zone

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_conn_zone` key zone = name:size;   |
|--------------------------------------------------------------------------------------|-------------------------------------------|
| 默认                                                                                   | —                                         |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http                                      |

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

使用示例：

```nginx
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 字节。

一个兆字节的区域可以保存大约 32000 个 32 字节的状态或大约 16000 个 64 字节的状态。如果区域存储空间耗尽，服务器将对所有进一步的请求返回 [错误](#limit-conn-status)。

<a id="built-in-variables-2"></a>

## 内置变量

<a id="v-limit-conn-status"></a>

### `$limit_conn_status`

保存连接数量限制的结果：`PASSED` 、`REJECTED` 或 `REJECTED_DRY_RUN`
