模块 ngx_http_limit_req_module
示例配置 指令 limit_req limit_req_dry_run limit_req_log_level limit_req_status limit_req_zone 嵌入变量 |
模块 ngx_http_limit_req_module
(0.7.21)用于限制每个定义的键的请求处理速率,特别是来自单个 IP 地址的请求的处理速率。使用“漏桶”方法进行限制。
示例配置
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5; }
指令
语法: | limit_req |
---|---|
默认值: | — |
上下文: | http , server , location |
设置共享内存区域和请求的最大突发大小。如果请求速率超过区域配置的速率,则其处理将延迟,以便请求以定义的速率进行处理。过多的请求将被延迟,直到其数量超过最大突发大小,此时请求将以错误终止。默认情况下,最大突发大小等于零。例如,以下指令
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /search/ { limit_req zone=one burst=5; }
每秒平均不允许超过 1 个请求,突发请求不超过 5 个。
如果在限制请求的同时不希望延迟过多的请求,则应使用参数 nodelay
:
limit_req zone=one burst=5 nodelay;
参数 delay
(1.15.7)指定了过多的请求变得延迟的限制。默认值为零,即所有过多的请求都会延迟。
可以有多个 limit_req
指令。例如,以下配置将限制来自单个 IP 地址的请求处理速率,并且同时限制虚拟服务器的请求处理速率:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; server { ... limit_req zone=perip burst=5 nodelay; limit_req zone=perserver burst=10; }
如果在当前级别未定义 limit_req
指令,则这些指令会从前一个配置级别继承。
语法: | limit_req_dry_run |
---|---|
默认值: |
limit_req_dry_run off; |
上下文: | http , server , location |
该指令出现在版本 1.17.1 中。
启用干运行模式。在此模式下,不限制请求处理速率,但在共享内存区域中,过多请求的数量仍然按照通常方式计算。
语法: | limit_req_log_level |
---|---|
默认值: |
limit_req_log_level error; |
上下文: | http , server , location |
该指令出现在版本0.8.18中。
设置服务器拒绝处理请求的速率超过时,或延迟请求处理时的所需日志记录级别。延迟的日志级别比拒绝的日志级别低一点;例如,如果指定了“limit_req_log_level notice
”,则使用 info
级别记录延迟。
语法: | limit_req_status |
---|---|
默认值: |
limit_req_status 503; |
上下文: | http , server , location |
该指令出现在版本1.3.15中。
设置拒绝请求时返回的状态码。
语法: | limit_req_zone |
---|---|
默认值: | — |
上下文: | http |
设置一个共享内存区域的参数,该区域将保存各种键的状态。特别是,状态存储当前的过量请求数量。 key
可以包含文本、变量及其组合。键值为空的请求不会被计算。
在版本1.7.6之前,一个 key
只能包含一个变量。
使用示例:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
在这里,状态保存在一个10兆字节的区域“one”中,该区域的平均请求处理速率不能超过每秒1个请求。
客户端IP地址作为一个键。请注意,这里使用的是 $binary_remote_addr
变量,而不是 $remote_addr
。对于IPv4地址,$binary_remote_addr
变量的大小始终为4字节,对于IPv6地址,始终为16字节。存储的状态在32位平台上总是占用64字节,在64位平台上总是占用128字节。一个兆字节的区域可以保存约16千个64字节的状态,或者约8千个128字节的状态。
如果区域存储已耗尽,则删除最近未使用的状态。如果即使在这之后也不能创建新的状态,则请求将以错误结束。
速率以每秒请求(r/s)指定。如果希望速率小于每秒一个请求,则以每分钟请求(r/m)指定。例如,半请求每秒为30r/m。
sync
参数(1.15.3)启用共享内存区域的同步。
sync
参数是作为我们的商业订阅的一部分提供的。
另外,作为我们的商业订阅的一部分,自1.17.7起,可以使用API获取或重置每个共享内存区域的状态信息。
嵌入式变量
-
$limit_req_status
-
保留请求处理速率限制的结果 (1.17.6):
通过
,延迟
,拒绝
,延迟模拟运行
, 或拒绝模拟运行