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

 更新时间:2024年12月27日 09:49:59   作者:曹朋羽  
本文主要介绍了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控制连接数及访问速率内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx报:Nginx - 504 Gateway Time-out问题解决办法

    Nginx报:Nginx - 504 Gateway Time-out问题解决办法

    这篇文章主要给大家介绍了关于Nginx报:Nginx - 504 Gateway Time-out问题的解决办法,一般是由于程序执行时间过长导致响应超时,例如程序需要执行90秒,而nginx最大响应等待时间为30秒,这样就会出现超时,需要的朋友可以参考下
    2024-01-01
  • nginx快速部署一个网站服务(多域名+多端口)

    nginx快速部署一个网站服务(多域名+多端口)

    本文主要介绍了nginx快速部署一个网站服务,并实现多域名和多端口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • Nginx服务器安装及配置文件与使用详解

    Nginx服务器安装及配置文件与使用详解

    这篇文章主要介绍了Nginx服务器安装及配置文件与使用详解 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • nginx提示502 页面的解决方法

    nginx提示502 页面的解决方法

    如果部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间
    2013-02-02
  • 为Node.js程序配置使用Nginx服务器的简明教程

    为Node.js程序配置使用Nginx服务器的简明教程

    这篇文章主要介绍了为Node.js程序配置使用Nginx服务器的简明教程,Nginx与Node自带的服务器一样都拥有非阻塞的高性能,需要的朋友可以参考下
    2016-01-01
  • linux(centos5.5)/windows下nginx开启phpinfo模式功能的配置方法分享

    linux(centos5.5)/windows下nginx开启phpinfo模式功能的配置方法分享

    某站点用到结合phpinfo功能的urlrewrite,在nginx中需要在nginx.conf文件中进行配置才可支持phpinfo
    2013-02-02
  • 用Nginx反向代理Node.js的方法

    用Nginx反向代理Node.js的方法

    本篇文章主要介绍了用Nginx反向代理Node.js的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Nginx出现403错误,应该如何解决

    Nginx出现403错误,应该如何解决

    这篇文章主要介绍了Nginx出现403错误,应该如何解决?具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • nginx 配置服务启动的教程详解

    nginx 配置服务启动的教程详解

    本文给大家详细介绍了nginx 配置服务启动的相关知识,非常不错,具有一定的参考借鉴价值,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • CentOS 7中利用yum安装Nginx的方法教程

    CentOS 7中利用yum安装Nginx的方法教程

    这篇文章主要给大家介绍了在CentOS 7中利用yum安装Nginx的方法教程,文中给出了详细的步骤介绍,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05

最新评论