连接限制#
该模块用于根据定义的键限制连接数量,特别是限制来自单个IP地址的连接数量。
并不是所有的连接都会被计数。只有当连接的请求正在被服务器处理且整个请求头已经被读取时,该连接才会被计数。
配置示例#
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
指令#
limit_conn#
设置共享内存区域和给定键值允许的最大连接数。当超过此限制时,服务器将返回 错误 作为请求的响应。例如,以下指令
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_log_level#
|
|
默认值 |
|
http, server, location |
设置当服务器限制连接数量时所需的日志记录级别。
limit_conn_status#
设置对被拒绝请求返回的状态码。
limit_conn_zone#
为共享内存区域设置参数,该区域将保存各种键的状态。特别是,状态包括当前连接数。键可以包含文本、变量及其组合。空键值的请求不计数。
使用示例:
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
#
保存限制连接数的结果:PASSED
、REJECTED
或 REJECTED_DRY_RUN