nginx限流方案

简介: nginx限流方案

一、引言

Nginx是被广泛使用的反向代理中间件,能够支持极高的并发访问,性能优越。在Nginx上添加限流功能是十分有必要的,能够对后端的服务进行保护,防止突发的流量致使应用崩溃。Nginx自带三种限流的方案,另外还支持集成lua模块进行限流。

二、ngx_http_limit_conn_module模块限流

ngx_http_limit_conn_module是连接数限流模块,用来对某个key对应的总的网络连接数进行限流,可以按照如IP、域名的维度进行限流。

2.1 限制IP的总连接数

http{

 limit_conn_zone $binary_remote_addr zone=perip:10m;

 limit_conn_log_level error;

 limit_conn_status 503;

 server{

   location /limit{

     limit_connperip 10;

     }

 }

}

2.2 限制某个域名(服务器)的总连接数

http{

 limit_conn_zone $server_name zone=perserver:10m;

 limit_conn_log_level error;

 limit_conn_status 503;

 server{

   location /limit{

     limit_connperserver 10;

     }

 }

}

2.3 配置项说明
  • limit_conn配置key值对应的内存空间以及并发数的大小
  • limit_conn_zone配置限流key值以及存储key值对应信息的内存大小,$binary_remote_addr表示IP,$server_name表示域名.
  • limit_conn_status被限流后返回的状态码,默认503
  • limit_conn_log_level被限流后的日志级别
2.4 执行流程
  1. Nginx接受请求后判断当前limit_conn_zone中对应key的连接数是否超过了配置的最大值
  2. 如果超过了则限流生效,返回limit_conn_status状态码,若不超过,则当前连接数加1,注册请求处理完成后的回调函数
  3. 请求转发给后端处理
  4. 后端请求返回,请求结束后调用回调函数对key连接数减1.

三、ngx_http_limit_req_module模块限流

ngx_http_limit_req_module是Nginx提供的基于漏桶算法实现的限流模块,用于平滑限流,同样是针对某个key,可以是$binary_remote_addr,也可以是$server_name。

3.1 限制IP请求速率

http{

 limit_req_zone$binary_remote_addr zone=perip:10m rate=1r/s;

 limit_conn_log_level error;

 limit_conn_status 503

   server{

   location /limit{

     limit_req zone=perip burst=5 nodelay;

   }

 }

}

3.2 限制域名(服务器)请求速率

http{

 limit_req_zone$server_name zone=perserver:10m rate=100r/s;

 limit_conn_log_level error;

 limit_conn_status 503

   server{

   location /limit{

     limit_req zone=perserver burst=5 nodelay;

   }

 }

}

3.3 配置项说明
  • limit_req配置限流的区域,桶的容量(默认为0),是否延迟模式(默认延迟)
  • limit_req_zone配置限流key值,内存大小,固定的请求速率。速率支持1r/s,也支持60r/m的表达式
3.4 执行流程
  1. 如果没有配置burst,则默认桶容量为0,则按照规定速率处理请求,如果请求被限流,则直接返回503.
  2. 如果配置了burst以及延迟模式(没有配置nodelay),则意味着允许突发的请求,请求的速率超过rate则超过的部分将会放入桶中,如果桶已经满了,则剩下的请求将会被限流。请注意后续的请求还是按照rate设置的固定速率处理的,这样子就可能产生一种情况,那就是设置的桶比较大,后续的流量又一直很大,而处理的速率又是固定的,那么会导致桶中的请求长时间等待,导致用户感觉响应时间变长。
  3. 为了解决上述问题,nginx提供了nodelay配置,此配置表示不会按照固定的速率延迟处理,而是会紧急处理桶中超出正常rate的部分请求,这样子实际上允许处理请求的速度超过rate的设置。这里危险点在于流量会超过rate的配置,但是好处是平均响应时间会比较短。

四、ngx_http_upstream_module限流

前面两种方案提供的其实都是向前的限流,而upstream模块提供了向后限流的功能。此模块有一个参数max_conns,在nginx1.11.5以后此功能已经在免费版本放开,提供对于后端某一台服务器的限流。

注意,max_conns是针对于每一个worker_processes的。

upstreamservice-name{

   ip_hash;

   server 192.168.1.2:8080 max_conns=50;

   server 192.168.1.3:8080 max_conns=50;

   server 192.168.1.4:8080 max_conns=50;

   server 192.168.1.5:8080 max_conns=50;

}

五、lua-resty-limit-traffic

除了Nginx自带的限流模块之外,还可以使用Lua提供的限流模块进行更加定制化地开发,例如OpenResty使用lua-resty-limit-traffic模块进行限流,可以实现Nginx本身提供地所有限流功能,甚至可以实现分布式限流。

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
14天前
|
存储 安全 应用服务中间件
解密Nginx限流机制:有效应对DDoS攻击与高并发流量
解密Nginx限流机制:有效应对DDoS攻击与高并发流量
28 0
|
10月前
|
存储 数据采集 算法
Nginx 限流算法大揭秘
Nginx 有多种限流算法....
184 0
Nginx 限流算法大揭秘
|
6月前
|
算法 NoSQL Java
分布式接口幂等性、分布式限流(Guava 、nginx和lua限流)
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。
|
7月前
|
存储 缓存 算法
Nginx限流和黑名单配置
Nginx限流和黑名单配置
347 0
|
10月前
|
Java 应用服务中间件 nginx
nginx限流配置理解与学习
nginx限流配置理解与学习
138 0
|
存储 缓存 算法
|
存储 算法 应用服务中间件
长这么大才读懂高并发核心编程,限流原理与实战,Nginx漏桶限流
使用Nginx可通过配置的方式完成接入层的限流,其ngx_http_limit_req_module模块所提供的limit_req_zone和limit_req两个指令使用漏桶算法进行限流。其中,limit_req_zone指令用于定义一个限流的具体规则(或者计数内存区),limit_req指令应用前者定义的规则完成限流动作。
|
存储 缓存 算法
Nginx 安装配置 | 图床搭建 | Nginx 限流 三大弹
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
255 0
Nginx 安装配置 | 图床搭建 | Nginx 限流 三大弹
|
监控 负载均衡 应用服务中间件
用keepalived搭建企业级nginx高可用方案
用keepalived搭建企业级nginx高可用方案
216 0
用keepalived搭建企业级nginx高可用方案
|
Web App开发 缓存 网络协议
nginx 限流模块和fail2ban搭配使用
ngnix的限流模块主要有三个: limit_conn 限制某个ip的tcp连接数目或者限制某个server(网站)整体的连接数目 limit_rate 现在每个请求的数据大小 limit_req 限制某个ip的请求次数 其中效果最明显的是第三个limit_req,但是宝塔面板中的流量限制只有前面两项的配置,所以之前一直流量限制没什么用。
372 0
nginx 限流模块和fail2ban搭配使用