环境:
CentOS7
Nginx 1.16.0
Nginx的请求限制
有两个模块:
连接频率限制: limit_conn_module
请求频率限制: limit_req_module
配置语法:
limit_conn_module
Syntax: limit_conn_zone key zone=name:size;
Default: ——
Context: http
zone为存储连接状态的一块空间, key为限制关键点, 比如remote_addr, 即限制ip地址, name 为zone空间的名字, size为空间的大小。
Syntax: limit_conn zone number;
Default: ——
Context: http, server, location;
相当于调用前者的定义, 选择zone,number为具体限制数字。
limit_req_module
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: ——
Context: http
rate=1r/s:表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,即每秒只处理一个请求,还可以有比如30r/m的,即限制每2秒访问一次,即每2秒才处理一个请求。
Syntax: limit_req zone=name [burst = number] [nodelay];
Default:——
Context: http, server, location
burst:重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
nodelay:
如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。(这里的rate的单位是:r/s)
如果没有设置,则所有请求会依次等待排队
注: 在具体配置中, $binary_remote_addr可节省内存使用量