Nginx访问限制模块分为:
请求频率限制:limit_req_module
连接频率限制:limit_conn_module
虚拟机下只能实现请求限制,连接限制要在云主机上进程。
Nginx请求限制配置
//Nginx请求限制语法
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
Syntax: limit_req zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
nginx.conf文件中:
//具体配置如下:
http {
//http段配置请求限制, rate限制速率,限制1秒钟最多1个请求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
...
server {
...
location / {
//每秒只接收一个请求,其余请求拒绝处理理并返回错误码给客户端
limit_req zone=req_zone;
//请求超过1r/s,剩下的将被延迟处理理,请求数超过burst定义的数量量,多余的请求返回503
#limit_req zone=req_zone burst=3 nodelay;
}
...
}
...
}
例1:
压力测试:
ab -n 50 -c 20 URL
可以看到50个请求,失败了49个
打开错误日志,看到其他请求都被限制了
例2:
压力测试:
ab -n 50 -c 20 URL
可以看到50个请求,失败了46个,因为有一个请求被响应处理,三个请求被延迟处理,其余错误返回
以上的配置,limit_req放在location/下面的,只对当前匹配的URL下有效,也就是说如果还有一个location /slow { root html;…},则请求http://ip/html/slow/index.html这个页面时,以上的请求限制配置是无效的。如果把它放在server下面,则任何请求该主机下资源的URL都有效。如果放在http下,则对所有其他虚拟主机下的资源访问也有效。
Nginx连接限制配置
//Nginx连接限制语法
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
//具体配置如下:
http {
//http段配置连接限制, 同⼀时刻只允许一个客户端连接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
...
server {
...
location / {
//同一时刻只允许一个客户端连接
limit_conn conn_zone 1;
}
...
}
...
}
由于一个连接可以发起多个请求,即多次请求可以建立在一次TCP连接之上,所有对请求频率的限制要比对连接频率的限制会更加有效。