运维之道 | Nginx限制对代理HTTP资源的访问

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次错误


Nginx官网配置文档
视频连接

发布了97 篇原创文章 · 获赞 10 · 访问量 3406

猜你喜欢

转载自blog.csdn.net/VillianTsang/article/details/103540119
今日推荐