网站首页 > 技术教程 正文
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发。这个时候接口进行限流是非常有必要的,而限流是Nginx最有用的特性之一,而且也是最容易被错误配置的特性之一。本篇文章主要讲讲Nginx如何对接口进行限流。
Nginx限流主要分为两种方式:
限制访问频率 限制并发连接数
为什么需要限流?开源人员可以通过限流限制访问速度来防止外部暴力扫描,或者减少密码被暴力破解的可能性。也可以解决流量突发问题(如线上活动导致访问量突增)。用一句话来概括就是说限流是用于保护服务器不会因为承受不住同一时刻的大量并发请求而宕机。接下来我们分别来看看Nginx的两种限流方式:
限制访问频率
限制访问频率其实需要分成两种情况:正常情况下进行访问频率限制以及流量突发情况下进行访问频率限制。我们分别看看这两种情况下Nginx是如何进行处理的:
正常流量限制访问频率
Nginx中使用ngxhttplimitreqmodule模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limitreqzone命令及limit_req命令限制单个IP的请求处理频率。
我们可以先来看看这两个命令的语法结构:
limit_req_zone key zone rate
对于上面语法结构的参数简单做下解释:
key: 定义需要限流的对象。 zone: 定义共享内存区来存储访问信息。 rate: 用于设置最大访问速率。
接下来我们看个简单的例子:
http { limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s; } server { location / { limit_req zone=myLimit; rewrite / http://www.niyueling.cn permanent; } }
突发流量限制访问频率
上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时候应该如何进一步处理呢?Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数:
http { limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s; } server { location / { limit_req zone=myLimit burst=5 nodelay; rewrite / http://www.niyueling.cn permanent; } }
可以看到我在原有的location中的limit_req指令中添加了burst=5 nodelay,如果没有添加nodelay参数,则可以理解为预先在内存中占用了5个请求的位置,如果有5个突发请求就会按照200ms去依次处理请求,也就是1s内把5个请求全部处理完毕。如果1s内有新的请求到达也不会立即进行处理,因为紧急程度更低。这样实际上就会将额外的5个突发请求以200ms/个去依次处理,保证了处理速率的稳定,所以在处理突发流量的时候也一样可以正常处理。如果添加了nodelay参数则表示要立即处理这5个突发请求。
限制并发连接数
Nginx中的ngxhttplimitconnmodule模块提供了限制并发连接数的功能,可以使用limitconnzone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:
http { limit_conn_zone $binary_remote_addr zone=myip:10m; limit_conn_zone $server_name zone=myServerName:10m; } server { location / { limit_conn myip 10; limit_conn myServerName 100; rewrite / http://www.niyueling.cn permanent; } }
上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。刚才有提到过Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。接下来我们来看看两个算法的介绍:
漏桶算法
漏桶算法是网络世界中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。也就是我们刚才所讲的情况。漏桶算法提供的机制实际上就是刚才的案例:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。
令牌桶算法
令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。
漏桶算法与令牌桶算法的区别两种算法都能够限制数据传输速率,但令牌桶还允许某种程度的突发传输。因为令牌桶算法只要令牌桶中存在令牌,那么就可以突发的传输对应的数据到目的地,所以更适合流量突发的情形下进行使用。
如果喜欢我的文章,欢迎关注我的个人公众号:程序猿周先森
猜你喜欢
- 2024-10-14 Nginx多策略流量分发(nginx ip分流)
- 2024-10-14 Nginx流量镜像(Mirror)(nginx 流量镜像)
- 2024-10-14 Nginx 一个牛X的功能,流量拷贝!(nginx copy)
- 2024-10-14 Nginx实时流量镜像(nginx流量控制)
- 2024-10-03 流量拷贝怎么办?Nginx模块mirror来助力-10
- 2024-10-03 分布式系统进阶二十三之流量网关和业务网关设计
- 2024-10-03 3分钟掌握nginx,让网站飞起来!(nginx最全教程)
- 2024-10-03 Nginx上的限流方式(nginx tcp 限流)
- 2024-10-03 性能工具之常见流量复制工具(性能工具之常见流量复制工具是什么)
- 2024-10-03 访问量一大服务器就挂?那是你不懂限流
你 发表评论:
欢迎- 08-06linux 和 windows文件格式互相转换
- 08-06谷歌 ChromeOS 已支持 7z、iso、tar 文件格式
- 08-06Linux下比较文件内容的6种方法
- 08-06文件格式及功能汇总
- 08-0610个Linux文件内容查看命令的实用示例
- 08-06Linux-如何区分不同文件类型
- 08-06Zabbix技术分享——监控windows进程资源使用情况
- 08-06Linux系统卡顿?学会ps命令这三招,轻松定位问题进程
- 最近发表
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)