
https://blog.csdn.net/remotesupport/article/details/6016245
https://blog.51cto.com/qiangsh/1765013
限制连接数
limit_zone
1 | limit_zone ZONENAME KEY THE_SIZE |
定义一个数据区,记录会话状态信息;
ZONENAME:zone_name,数据区域的名字;
KEY:这里可以是一个变量$variable,是判断会话的变量,唯一指定一个会话的变量;
THE_SIZE:the_size,记录区的总容量。
例子
1 | limit_zone one $binary_remote_addr 10m |
定义一个名为“one”的区域,容量10m,
以变量**$binary_remote_addr为判断会话的基准,即一个地址一个会话**。
$remote_addr长度为7-15bytes,会话信息长度为32-64bytes;
$binary_remote_addr长度为4bytes,会话信息长度为32bytes。
limit_conn
1 | limit_conn ZONE_NAME THE_SIZE |
指定一个区域会话最大的并发连接数;
当连接数超过指定的并发连接数,会返回503错误;
- ZONE_NAME:zone_name,区域的名字,由limit_zone定义;
- THE_SIZE:the_size,允许的并发连接数。
例子
1 | limit_zone one $binary_remote_addr 10m; |
定义一个名为one的区域,容量为10m(这里容量指的是:10MB),一个地址一个会话;
在/download/目录下,一个会话只能发起5个连接,超过的进行503处理。
limit_conn_zone
位于:http
1 | limit_conn_zone KEY zone=NAME:SIZE |
定义一个区域:唯一标识一个会话、名字、大小;
KEY:这里一般为$binary_remote_addr,唯一标识一个区域会话的变量;$binary_remote_addr即为用一个IP表示一个区域会话。
NAME:区域的名字;
SIZE:大小,单位字节;10m表示10MB。
例子
1 | limit_conn_zone $binary_remote_addr zone=addr:10m |
- 定义一个区域,名字为addr,判断会话用变量**$binary_remote_addr,区域名字为addr,大小10MB**;
- 在location/下面,在名为addr的区域,一个会话允许最大连接数为5,速度限制100K;
limit_conn_log_level
1 | limit_conn_log_level info|notice|warn|error; |
当达到最大连接数,记录日志的等级。
limit_conn_status
1 | Syntax: limit_conn_status code; |
超过限制后,返回的相应状态码,默认503.
案例:根据请求参数限制连接
1 | limit_conn_zone $mp_limit_key zone=mp:10m; |
依据**$mp_limit_key**定义一个会话,区域名为mp,限制大小10MB;
使用正则表达式.*mp=(\d+).*
取出参数mp并设置值到mp_limit_key;
限制连接数为10。
Variable
$binary_remote_addr和$remote_addr
$remote_addr长度为7-15bytes;
$binary_remote_addr长度为4bytes。
都是客户端地址;
$server_name
上游服务器的地址;
$query_string
请求连接的地址;