详解Nginx限流方案的实现

服务器
一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流。

[[412695]]

 概述

一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流。通过查看nginx官方文档,小编查看到了三种nginx限流方式。

  • 1、limit_conn_zone
  • 2、limit_req_zone
  • 3、ngx_http_upstream_module

前两种只能对客户端(即单一ip限流),并且文档也很全,但是经过测试发现,还是无法达到官方文档所说的结果(可能小编的测试方法有问题)。

这里先简单的介绍一下前两种:

limit_conn_zone

nginx配置

 

其中“limit_conn one 10”既可以放在server层对整个server有效,也可以放在location中只对单独的location有效。

该配置表明:客户端的并发连接数只能是10个。

结果

  • ab工具20并发去请求nginx,可以看到
  • Complete requests: 20
  • Failed requests: 9

(由于nginx配置中一个ip并发连接数为10,而结果中成功数为+1的原因未知;nginx的日志中也可以看到有9个请求返回503)

limit_req_zone

nginx配置

 

其中“limit_req zone=req_one burst=120”既可以放在server层对整个server有效,也可以放在location中只对单独的location有效。

rate=1r/s的意思是每个地址每秒只能请求一次,也就是说令牌桶burst=120一共有120块令牌,并且每秒钟只新增1块令牌,120块令牌发完后,多出来的请求就会返回503.。

ngx_http_upstream_module

介绍

作为优秀的负载均衡模块,目前是我工作中用到最多的。其实,该模块是提供了我们需要的后端限流功能的。通过官方文档介绍,该模块有一个参数:max_conns可以对服务端进行限流,可惜在商业版nginx中才能使用。然而,在nginx1.11.5版本以后,官方已经将该参数从商业版中脱离出来了,也就是说只要我们将生产上广泛使用的nginx1.9.12版本和1.10版本升级即可使用(通过测试可以看到,在旧版本的nginx中,如果加上该参数,nginx服务是无法启动的)。

配置

 

结果(不便截图)

用两台机器各自用ab工具向nginx发送20、30、40个并发请求:

可以看到无论并发多少,成功的请求只有12个,成功的次数会多个2个,同时1.2的测试结果中成功次数也是+1,这里是两台机器,基于此种考虑,将机器增加至三台,果然成功的次数为13个。这里得出一个假想,成功的请求数会根据客户端的+1而+1(这里只是假设)

注:还有很重要的几点。max_conns是针对upstream中的单台server的,不是所有;nginx有个参数:worker_processes,max_conns是针对每个worker_processes的;

 

责任编辑:武晓燕 来源: 今日头条
相关推荐

2021-03-30 10:46:42

SpringBoot计数器漏桶算法

2018-11-16 10:39:02

Nginx负载均衡方案

2022-05-29 21:38:11

限流熔断流量

2021-05-21 08:30:26

Sentinel GateWay 微服务

2018-04-10 10:15:48

微服务架构Nginx

2024-11-05 15:02:41

2023-09-06 15:22:26

限流Java

2021-10-29 13:26:54

单点登录SSO

2022-07-05 09:44:25

服务治理熔断限流

2024-04-08 11:04:03

2021-05-14 07:45:07

Sentinel 接口限流

2024-10-17 16:30:28

2021-11-05 21:33:28

Redis数据高并发

2022-05-19 14:14:26

go语言限流算法

2023-08-08 08:01:22

微服务架构服务

2023-08-26 07:09:36

2019-05-27 14:03:48

开发技能代码

2024-08-02 19:49:41

2024-02-26 14:07:18

2024-01-03 08:30:54

Redis分布式项目
点赞
收藏

51CTO技术栈公众号