nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > nginx控制连接数及访问速率

nginx控制连接数及访问速率的实现

作者:曹朋羽

本文主要介绍了Nginx中ngx_http_limit_conn_module和ngx_http_limit_req_module模块的使用,用于控制连接数和请求速率,具有一定的参考价值,感兴趣的可以了解一下

连接数控制

ngx_http_limit_conn_module 模块用来限制每个定义的key对应的连接数。

不是所有的连接都会被计数,当一个连接请求被服务端处理并且这个请求头被读取时候,这个连接被算作一个连接。

limit_conn_zone key zone=name:size;

limit_conn_zone 用来定义在 http 块中定义一个共享内存区域,存储客户端的连接数。key用来区分不同的客户端连接。name用来指定区域的名称,size指定内存大小。key可以是文本或变量,如果一个请求的key是空不会进行请求计数。这里实际就是维护了一个内存map区域(key,count)。

如下:

limit_conn_zone $binary_remote_addr zone=addr:10m;

开辟一个10m的内存区域,名称为addr,key为b i n a r y r e m o t e a d d r 。 binary_remote_addr。binaryr​emotea​ddr。binary_remote_addr表示按客户端 IP 地址进行计数。zone定义完成后主要是为了limit_conn 指令限连接数使用。

limit_conn zone number;

limit_conn指令用于限制同一客户端的最大连接数。要与 limit_conn_zone 配合使用。这里的zone就是引用的limit_conn_zone 定义的区域名称,number是限制最大连接数。当超过最大连接数时,会返回特定的错误。默认是503.可以通过limit_conn_status code; 来指定特定的错误码。

limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_status 429;
server {
    location /download/ {
        limit_conn addr 2;
}

上面表示开辟一个10M的内存区域名为addr,用来统计每个客户端IP($binary_remote_addr)的请求数量,限制每个IP最多只能有2个并发连接。如果超过并发数,则返回429错误。

limit_conn指令可以重复出现

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 5;
    limit_conn perserver 100;
}

如上表示限制每个客户端最大并发数是5,一个server同时最大支持连接是100.

https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

请求速率控制

处理限制客户端连接数外,还可以通过ngx_http_limit_req_module模块来限制客户端的请求速率。指令和限制连接数差不多。

limit_req_zone key zone=name:size rate=rate ;

limit_req_zone 指令用来定义请求速率限制内存区域,key同limit_zone指令,用来标识计算速率的key值,name是内存区域名称,size是内存大小,rate是速率,单位 每秒是(r/s),没分钟是 (r/m)。该指令只能在http块使用。

limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s;

上面配置表示使用客户端IP为key,统计客户端请求速率,内存大小为10m。1M的内存大约可存储16000个IP的统计信息,所以10M大概可以统计16万个IP。 内存区域名称为limitbyaddr,控制客户端请求速率为每秒3个请求。

limit_req指令限制速率

limit_req zone=name [burst=number] [nodelay | delay=number];

limit_req用来设置请求速率,zone指定使用的limit_req_zone 设定的区域名称。这样nginx会安装zone指定的速率来控制客户端请求。对应超过给定速率的请求,nginx 会进行拒绝处理。防止过多的请求对服务器造成压力。

如果zone的内存耗尽后,nginx会移除最早的key。如果此时空间还不够存储新的请求记录,则nginx或返回503错误。

然而对应一个网站或应用来说,访问流量起始不是平顺的,存在波动,如果波动超过速率就进行拒绝其实这也不是我们想要的,影响应用整体稳定性。这个时候可以使用burst参数来处理突发流量。burst 参数允许请求数量短时间内超过正常的速率限制,最多可达到指定的 burst 值。

配合burst使用还有一个 delay和nodelay参数。nodelay 表示在处理突发请求时,不会延迟这些突发请求的处理。如果没有这个参数,突发的请求会被排队并延迟,直到可以按照速率限制处理为止。

limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s;
server {
    location / {
        limit_req zone=limitbyaddr burst=12 delay=9;
    }
}

上面配置正常每秒钟限制3个请求 ,允许最大峰值波动请求是12个,第9个超过速率的请求会放入队列延迟处理。

超过限制速率被拒绝的请求,也可以自动义状态码,通过limit_req_status 指令设置。

到此这篇关于nginx控制连接数及访问速率的实现的文章就介绍到这了,更多相关nginx控制连接数及访问速率内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文