Nginx限制对代理HTTP资源的访问
一、限制连接数
1、使用limit_conn_zone
指令定义密钥并设置共享内存区域的参数(工作进程将使用该区域共享密钥值的计数器)。作为第一个参数,指定评估为键的表达式。在第二个参数中zone,指定区域的名称及其大小:
limit_conn_zone $ binary_remote_addr zone = addr:10m ;
2、使用limit_conn
指令的适用范围内的限制,或上下文。将共享内存区域的名称指定为第一个参数,并将每个键的允许连接数指定为第二个参数:location {}server {}http {}
location /download/ {
limit_conn addr 1;
}
连接数受IP地址限制,因为该$binary_remote_addr变量用作键。
实战:
1、在发布目录中创建download目录,并写入数据
[root@localhost download]# ls
nginx.jpg
2、修改nginx.conf配置文件
方法1
http {
#...
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
#...
location /download/ {
limit_conn addr 1;
}
}
}
方法2
http {
limit_conn_zone $server_name zone=servers:10m;
server {
limit_conn servers 1000;
}
}
3、通过Apache Benchmark(ab) 压力测试工具进行测试
- 设置1个并发连接,10次请求(成功)
[root@localhost conf]# ab -c 1 -n 10 http://192.168.146.133/download/nginx.jpg/
......
Concurrency Level: 1 ///一次并发连接
Time taken for tests: 0.003 seconds ///用时0.003秒
Complete requests: 10 ///完成10次请求
Failed requests: 0 ///0次失败
Write errors: 0 ///0次错误
......
- 设置4个并发连接,10次请求(失败)
[root@localhost conf]# ab -c 4 -n 10 http://192.168.146.133/download/nginx.jpg/
......
Concurrency Level: 4 ///4次并发连接
Time taken for tests: 0.003 seconds ///用时0.003秒
Complete requests: 10 ///完成10次请求
Failed requests: 6 ///6次请求失败
(Connect: 0, Receive: 0, Length: 6, Exceptions: 0)
Write errors: 0 ///0次错误
......
二、限制请求率
速率限制可用于防止DDoS攻击,或防止上游服务器同时被太多请求淹没。该方法基于以下算法:请求以各种速率到达存储桶,并以固定速率离开存储桶。leaky bucket
在使用速率限制之前,您需要配置“泄漏桶”的全局参数:
- 键-用于区分一个客户端与另一个客户端的参数,通常是一个变量
- 共享内存区域-保留这些键的状态的区域的名称和大小(“漏斗”)
- rate-以每秒请求数(r/s)或每分钟请求数()指定的请求速率限制r/m(“漏斗排放”)。每分钟请求数用于指定小于每秒一个请求的速率。
这些参数是通过limit_req_zone
指令设置的。该指令在级别上定义-这种方法允许应用不同的区域并向不同的上下文请求溢出参数:http {}
实战:
1、修改nginx.conf配置文件(处理一秒只允许一次的请求)
http {
#...
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ///一秒只允许一个请求
server {
#...
location /download/ {
limit_req zone=one;
}
}
}
2、通过Apache Benchmark(ab) 压力测试工具进行测试
[root@localhost conf]# ab -c 1 -n 2 http://192.168.146.133/download/nginx.jpg/
......
Concurrency Level: 1 ///1次并发连接
Time taken for tests: 0.001 seconds ///用时0.001秒
Complete requests: 2 ///完成2次请求
Failed requests: 1 ///1次请求失败
(Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
Write errors: 0 ///0次错误
......
一秒只允许进行一次请求,超过的,请求失败
1、修改nginx.conf配置文件(处理过多的请求)
NGINX中的此类过多请求可以被缓冲和处理。伪指令的burst
参数limit_req
设置等待以指定速率处理的过多请求的最大数量:
http {
#...
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
#...
location /search/ {
limit_req zone=one burst=5;
}
}
}
使用此配置,如果请求速率超过1次每秒请求数,则超出该速率的请求将被放入zone中one。当区域已满时,过多的请求将排队(burst),此队列的大小为5请求。队列中的请求处理将以总速率不大于指定速率的方式延迟。超出突发限制的请求将被拒绝并显示503错误。
2、通过Apache Benchmark(ab) 压力测试工具进行测试
[root@localhost conf]# ab -c 1 -n 10 http://192.168.146.133/download/nginx.jpg/
Concurrency Level: 1 ///1次并发连接
Time taken for tests: 9.002 seconds ///用时9.002秒
Complete requests: 10 ///完成10次请求
Failed requests: 0 ///0次请求失败
Write errors: 0 ///0次错误
相比上面,请求进行排队,用时变长,所有请求都完成
[root@localhost conf]# ab -c 6 -n 10 http://192.168.146.133/download/nginx.jpg/
Concurrency Level: 6 ///6次并发连接
Time taken for tests: 5.002 seconds ///用时5.002秒
Complete requests: 10 ///完成10次请求
Failed requests: 4 ///4次请求失败
Write errors: 0 ///0次错误
超过队列burst=5
的,其他请求失败
三、限制带宽(下载速率)
使用此设置,客户端将能够通过单个连接以最大50千字节/秒的最大速度下载内容。但是,客户端可以打开多个连接。因此,如果目标是防止下载速度大于指定值,则连接数量也应受到限制。例如,每个IP地址一个连接(如果使用了上面指定的共享内存区域):
1、修改nginx.conf配置文件(1K字节/秒的最大速度下载内容)
location /download/ {
limit_rate 4k;
}
2、通过Apache Benchmark(ab) 压力测试工具进行测试
[root@localhost conf]# ab -c 1 -n 10 http://192.168.146.133/download/nginx.jpg/
Concurrency Level: 1 ///1次并发连接
Time taken for tests: 0.003 seconds ///用时0.003秒
Complete requests: 10 ///完成10次请求
Failed requests: 0 ///0次请求失败
Write errors: 0 ///0次错误