nginx配置限流
三种实现方式:
limit_conn_zone limit_req_zone ngx_http_upstream_module
安装压测工具
|
|
配置nginx限流
第一种:limit_conn_zone限制连接数,特别是来自单个IP地址的连接数。
并非所有连接都会被计数。仅包含服务器正在处理的请求并且已读取整个请求头时,才对连接进行计数。
** 在http字段中添加:**
limit_conn_zone $binary_remote_addr zone=addr:10m;
含义:
$binary_remote_addr
: 使用这个标识来确认用户身份唯一性,$binary_remote_addr变量的大小对于IPv4地址始终为4字节,对于IPv6地址始终为16字节。存储状态在64位平台上总是占用64字节。一个1兆字节的区域可以保留大约1.6万个64字节状态。如果区域存储已用尽,服务器将把错误返回给所有请求。zone
: 指定一个共享内存区域名称为addr,大小为10m。当超过此限制时,服务器将返回错误
** 在server字段添加:**
limit_conn addr 1;
含义:每个ip只允许1个连接,使用的是addr共享区域
** 测试:**
ab -c 1 -n 10 http://192.168.2.200/
一个连接发送10个请求
访问正常
ab -c 2 -n 10 http://192.168.2.200/
2个连接发送10个请求
其中有1个访问是失败的
第二种:limit_req_zone,用于限制单一的IP地址的请求的处理速率。
在http字段中添加:
limit_req_zone $binary_remote_addr zone=addr_req:10m rate=1r/s;
含义:
$binary_remote_addr
:同上zone
: 指定一个共享内存区域名称,大小为10m。当超过此限制时,服务器将返回错误rate
: 代表每秒处理1个请求
在server字段添加:
limit_req zone=addr_req burst=5;
含义:
zone
:使用的是addr_req共享区域
burst=5
:代表超出频率的访问请求会放到缓冲区,最多放5个,超过这5个的请求会直接报503的错误。
测试:
ab -c 10 -n 10 http://192.168.2.210/
10个连接发送10个请求,我们限制的是每秒1个请求,第一个请求会被处理,后面的请求会放到缓冲区,超过5个会返回错误。所以会有6个请求是成功的。
第三种:ngx_http_upstream_module模块的max_conns(在nginx 1.11.5版本以后可用)
限制nginx到后端服务器的连接数,默认为0,无限制。 在upstream中每个主机后面配置 max_conns=2
测试:
ab -c 3 -n 10 http://192.168.2.210/