限流算法一般有两种:
令牌桶算法:
思路:1、按照一定速率向令牌桶投送令牌。令牌桶满,则丢弃令牌 2、当请求过来时候,会经过一个过滤器,过滤器过滤的请求会经过令牌桶处理。3、请求只有拿到令牌才能被执行,拿不到令牌的请求被缓存 4、通过这种方式就能够控制请求的流量,令牌添加的速度就是请求流量的速度。
漏桶算法:
思路:请求先进入漏桶,漏桶以一定速率漏水,漏出的水会先处理,当水流远远大于漏桶漏水的速率,这个时候,水就会直接溢出。这里可以把请求当作水,这就是漏桶算法的大致思路。
nginx中主要通过漏桶算法来做限流
下面介绍下nginx中限流的主要方式:
//一、单位时间访问限流
//nginx.conf文件
//*http模块中添加:
//限制请求
limit_req_zone $binary_remote_addr $uri zone=api_read:20m rate=20r/s;
//说明:上述命令语法为:limit_req_zone key zone rate
//1、key为定义限流对象,这里的key为$binary_remote_addr,意思是对客户端ip来进行限流
//2、zone:定义共享内存来存储访问信息,api_read:20m 表示大小为20m,名字为api_reda的共享内存区域
//1m可以存放16000的IP地址访问信息
//3、rate就是访问速率,表示每秒能够接收多少请求。20r/s就是每秒最多处理20个请求
//*location模块中添加
limit_req zone=api_read burst=25 nodelay;
//说明:
//1、zone=api_read共享内存信息
//2、burst=25 burst表示突发流量处理,如果流量突然增大超出rate=20r/s,超出的请求将被拒绝,无法处理突发流量。
//burst就是来解决这个问题的,表示超过设定的处理速率后能额外处理的请求数
//相当于缓存队列中加多了25个坑来存放这些多出的请求,如果请求还是多于这些坑,将被拒绝
//3、nodelay 立即执行 delay延迟执行 (并发超出的请求)```
### 二、限制并发连接数
```bash
//nginx.conf文件
//*http模块中添加:
//限制并发连接数量
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;//根据ip来限制
limit_conn_zone $server_name zone=perserver_conn:100m;//根据server_name来限制
//*location模块中添加
//连接数限制,每个IP并发请求为2
limit_conn perip_conn 2;
//服务所限制的连接数(即限制了该server并发连接数量)
limit_conn perserver_conn 1000;```
以上就是我所了解的两种nginx限流的方式,如有错误,希望大佬指出