一文搞懂Nginx限流,原来这么简单

【一文搞懂Nginx限流,原来这么简单】Nginx现在已经是最火的负载均衡之一 , 在流量陡增的互联网面前 , 接口限流也是很有必要的 , 尤其是针对高并发的场景 。Nginx的限流主要是两种方式:限制访问频率和限制并发连接数 。

一文搞懂Nginx限流,原来这么简单

文章插图
 
一、限制访问频率(正常流量)Nginx中我们使用 ngx_http_limit_req_module 模块来限制请求的访问频率 , 基于漏桶算法原理实现 。接下来我们使用 nginx limit_req_zone 和 limit_req 两个指令 , 限制单个IP的请求处理速率 。
语法:limit_req_zone key zone rate
一文搞懂Nginx限流,原来这么简单

文章插图
 
  1. key :定义限流对象 , binary_remote_addr 是一种key , 表示基于 remote_addr(客户端IP) 来做限流 , binary_ 的目的是压缩内存占用量 。
  2. zone:定义共享内存区来存储访问信息 ,  myRateLimit:10m 表示一个大小为10M , 名字为myRateLimit的内存区域 。1M能存储16000 IP地址的访问信息 , 10M可以存储16W IP地址访问信息 。
  3. rate 用于设置最大访问速率 , rate=10r/s 表示每秒最多处理10个请求 。Nginx 实际上以毫秒为粒度来跟踪请求信息 , 因此 10r/s 实际上是限制:每100毫秒处理一个请求 。这意味着 , 自上一个请求处理完后 , 若后续100毫秒内又有请求到达 , 将拒绝处理该请求 。
二、限制访问频率(突发流量)按上面的配置在流量突然增大时 , 超出的请求将被拒绝 , 无法处理突发流量 , 那么在处理突发流量的时候 , 该怎么处理呢?Nginx提供了 burst 参数来解决突发流量的问题 , 并结合 nodelay 参数一起使用 。burst 译为突发、爆发 , 表示在超过设定的处理速率后能额外处理的请求数 。
一文搞懂Nginx限流,原来这么简单

文章插图
 
burst=20 nodelay 表示这20个请求立马处理 , 不能延迟 , 相当于特事特办 。不过 , 即使这20个突发请求立马处理结束 , 后续来了请求也不会立马处理 。burst=20 相当于缓存队列中占了20个坑 , 即使请求被处理了 , 这20个位置这只能按 100ms一个来释放 。这就达到了速率稳定 , 但突然流量也能正常处理的效果 。
三、限制并发连接数Nginx 的 ngx_http_limit_conn_module 模块提供了对资源连接数进行限制的功能 , 使用 limit_conn_zone 和 limit_conn 两个指令就可以了 。
一文搞懂Nginx限流,原来这么简单

文章插图
 
  1. limit_conn perip 20:对应的key是 $binary_remote_addr , 表示限制单个IP同时最多能持有20个连接 。
  2. limit_conn perserver 100:对应的key是 $server_name , 表示虚拟主机(server) 同时能处理并发连接的总数 。注意 , 只有当 request header 被后端server处理后 , 这个连接才进行计数 。




    推荐阅读