Nginx
🗒️Nginx限流原理及实现
00 min
2021-7-2
2024-2-28
type
status
date
slug
summary
tags
category
icon
password

1、简介

  • 限流两个算法漏桶(LeakyBucket)算法和令牌桶算法(TokenBucket)
  • nginx接入层限流可以使用Nginx自带的两个模块:
    • 漏桶算法实现的请求限流模块ngx_http_1imit_req_module控制速率。
    • #limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=l0r/s
    • limit_req zone=contentRateLimit burst=50 nodelay
    • 连接数限流模块ngx_http_limit_conn_module控制并发数
    • limit_conn_zone
    • limit_conn
  • SpringGateWay网关限流,使用的令牌桶算法。SpringCloudGateWay默认使用redis的RateLimter限流算法来实现。

2、限流算法(漏桶算法和令牌桶算法)

2.1、漏桶(LeakyBucket)算法

请求大于接口响应速率直接拒绝,接口响应速率匀速
思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。示意图如下:

2.2、令牌桶算法(TokenBucket)

和Leaky Bucket效果一样但方向相反的算法,更加容易理解。随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了,新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务。

2.3、两者区别

在于”漏桶算法“能够强行限制数据的传输速率,而“令牌桶算法“在能够限制数据的平均传输速率外,还允许某种程度的突发传输。在令牌桶算法“中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,所以它适合于具有突发特性的流量。

3、Nginx控制速率配置

3.1、配置一个最基本的空桶

修改/usr/local/openresty/nginx/conf/nginx.conf

3.2、配置burst

3.3、配置nodelay

4、Nginx控制并发量(连接数)

ngx_http_limit_conn_module提供了限制连接数的能力。主要是利用limit_conn_zonelimit_conn两个指令。