NGINX速率限制是一个很重要的流量管理模块,用来限制单位时间的请求数。通过正确有效地配置,特定客户端对某一个URI的访问频率频率可以得到有效地限制, 从而可以有效地减缓暴力密码破解攻击,也可以有效减缓DDOS攻击的破坏性,还可以防止上游服务器被大量并发的请求耗尽资源。
1、并发连接数限制
模块名称:ngx_http_limit_conn_module
该模块对访问连接中含有指定变量且变量值相同的连接进行计数,指定的变量可以是客户端IP地址或请求的主机名等。当计数值达到limit_conn指令设定的值时,将会对超出并发连接数的连接请求返回指定的响应状态码(默认状态码为503)。该模块只会对请求头已经完全读取完毕的请求进行计数统计。由于Nginx采用的是多进程的架构,该模块通过共享内存存储计数状态以实现多个进程间的计数状态共享。
limit_conn_zone $binary_remote_addr zone=addr:10m; # 对用户IP进行并发计数,将计数内存区命名为addr,设置计数内存区大小为10MB
server {
location /web1/ {
limit_conn addr 1; # 限制用户的并发连接数为1
}
}
并发连接数同样支持多个变量的同时统计
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;
}
2、请求频率限制
模块名称:ngx_http_limit_req_module
该模块会对指定变量的请求次数进行计数,当该变量在单位时间内的请求次数超过设定的数值时,后续请求会被延时处理,当被延时处理的请求数超过指定的队列数时,将返回指定的状态码(默认状态码为503)。通常该模块被用于限定同一IP客户端单位时间内请求的次数。该模块通过共享内存存储计数状态以实现多个工作进程间的同一变量计数状态的共享。
http {
limit_req_zone $server_name zone=addr:10m rate=1r/s;
# 限制访问当前站点的请求数,对站点请求计数,将计数内存区命名为addr,设置计数内存区大小为10MB,请求限制为1秒1次
server {
location /search/ {
limit_req zone=one;
# 同一秒只接收一个请求,其余的立即返回状态码503,直到第2秒才接收新的请求
limit_req zone=one burst=5;
# 同一秒接收6个请求,其余的返回状态码503,只处理一个请求,其余5个请求进入队列,每秒向Nginx释放一个请求进行处理,同时允许接收一个新的请求进入队列
limit_req zone=one burst=5 nodelay;
# 同一秒接收6个请求,其余的返回状态码503,同时处理6个请求,6秒后再接收新的请求
}
}
}
limit_req_zone的rate参数的作用是对请求频率进行限制,有r/s(每秒的请求次数)和r/m(每分钟的请求次数)两个频率单位,也可根据每秒的次数换算成毫秒单位的次数。1MB内存大小大约可以存储16 000个IP地址的状态信息。
评论区