当前位置:   article > 正文

Nginx限流三板斧--漏桶算法、令牌桶算法、计数器算法_nginx 漏桶

nginx 漏桶

在高并发场景下,为了减轻服务器的压力,nginx采取了“限流三板斧”(我自己命名的,哈哈)。下面我们一一介绍这三种算法以及,nginx的配置。

一、漏桶算法

1、第一种配置

1)配置

首先看下官网吧 http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

 ngx_http_limit_req_module 模块是 0.7.21版本后新增的模块,默认已经安装。

http {

......

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

location / {

                # 设置状态码以响应被拒绝的请求而返回

                limit_req_status 520;
                limit_req zone=one;
}

配置完重启nginx

参数说明

$binary_remote_addr 客户端ip(还有$server_name,限制虚拟服务器的请求,参考nginx文档)

binary_ 的目的是压缩内存占用量。

zone=one:10 在内存中开辟一块10M的空间,命名为one

rate=1r/s 每秒只接受1个请求

解释:不难看出以ip限速,是以客户为一个单位限速的,也就是你的请求速度和我请求速度都是1个请求每秒。流出速率是一样的。

2)现象

一秒请求一次,返回正常,如果1秒内请求多次就会出现503(如果你设置了错误code会返回你设置的),说明其他请求被格挡掉了。

 2、第二种配置

 1)配置

http {

......

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

location / {

                # 设置状态码以响应被拒绝的请求而返回

                limit_req_status 520;
                limit_req zone=one burst=5;
}

参数说明

burst=5 缓冲5个请求,相当于在桶里放了5个请求,请求的流出速率还是1,没进入桶内的请求在zone缓冲区内等待,所有的请求不抛弃。

2)现象

 我连续请求多次,可以发现所有的请求都成功了,但是速率还是一秒一个请求的处理。

3、第三种配置

1)配置

http {

......

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

location / {

                # 设置状态码以响应被拒绝的请求而返回

                limit_req_status 520;
                limit_req zone=one burst=5 nodelay;
}

参数说明

nodelay 这个配置在上一个配置做了写处理,桶里还是会缓存5个请求,但是桶外的请求会直接丢弃,桶内的请求会并发立即处理。

2)现象

JMeter下载地址 https://jmeter.apache.org/download_jmeter.cgi

 可以看到桶内的请求会立马全部并发执行,其他的没进来的就直接丢弃掉了。

总结

在实际生产环境中,服务器配置的参数还需要根据实际测试结果来定义,因为每个公司的业务场景不一样,所以需要设置符合自己公司的参数。多应用压力测试工具,比如apche的ab测试工具,JMeter等

二、令牌桶算法

 配置

http {

......

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

location / {

                # 设置状态码以响应被拒绝的请求而返回

                limit_req_status 520;
                limit_req zone=one burst=5 nodelay;

                # limit_rate_after 500k;

                # 单位默认是字节

                limit_rate 1k;
}

现象:可以看见,下载速度几乎是每秒1k左右。 

总结

这个配置是带宽的限制来限制用户的流量,主要应用在下载视频或者图片资源之类的场景中。

三、计数器算法

配置1:

 http {

......

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

limit_conn_zone $binary_remote_addr zone=two:10m;

location / {

                # 设置状态码以响应被拒绝的请求而返回

                limit_req_status 520;
                limit_req zone=one burst=5 nodelay;

                # 单位默认是字节

                limit_rate 1k;

                # 一个用户最多只能并发1个连接

                limit_conn two 1;
}

配置2: 

http {
# 定义限流策略
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
# 搜索服务的虚拟主机
server {
location / {
# 对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 1 个连接。
limit_conn perip 1;
# 对应的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。注意,#只有当 request header 被
#后端 server 处理后,这个连接才进行计数。
limit_conn perserver 10 ;
    }
  }
}

总结

这个配置是修改用户的并发请求个数或者是服务器总共并发请求数,来减轻服务器的压力。

四:总结

nginx的这几种配置和相互配合使用,一起来限制请求,减轻服务器压力。三板斧还是比较好使的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/645667
推荐阅读
相关标签
  

闽ICP备14008679号