微服务架构—Nginx速率限流

Posted 微技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务架构—Nginx速率限流相关的知识,希望对你有一定的参考价值。


1 简介

        nginx作为微服务架构的流量接入层,主要使用 ngx_http_limit_req_module 模块实现漏桶算法的请求速率的限制。主要流程如下:

微服务架构—Nginx速率限流
Nginx-速率限流主要流程

Nginx速率限流的主要流程如下:
① 客户端向Nginx发起请求
② Nginx近 burst配置校验
burst未配置,则直接进行速率( rate)校验
④ 速率校验超额,则返回指定错误码给客户端
⑤ 速率校验未超额,则将请求转发至后端服务器
⑥ burst配置了且大于0,则进行 burst校验
burst<max,则进行速率( rate)校验
burst>max,则校验延迟模式( nodelay)是否配置
⑨ 延迟模式已配置,则进入队列进行等待被处理
⑩ 若未配置延迟模式,则直接返回503错误码给客户端

2 核心配置

2.1 limit_req

        limit_req 主要用于配置限流区域、突发容量(默认为0)和是否延迟模式(默认为延迟模式)。

  • 使用语法

    limit_req zone=[name] [burst=number] [nodelay];
  • 配置段

    http,server,location

2.2 limit_req_zone

        limit_req_zone 主要用于配置限流key、存放key对应信息的共享内存区域大小和固定请求速率。该功能只有Nginx version≥1.7.6的版本才被支持。

  • 使用语法

    limit_req_zone [key] zone=[name]:[size] rate=[rate];
  • 配置段

    http

2.3 limit_conn_log_level

        limit_conn_log_level 主要用于配置被限流后的日志级别,默认为error级别。该功能只有Nginx version≥0.8.18的版本才被支持。

  • 使用语法

    limit_conn_log_level info|notice|warn|error;
  • 配置段

    http,server,location
  • 默认值

    limit_conn_log_level error;

2.4 limit_conn_status

        limit_conn_status 主要用于配置被限流后的返回的状态,默认会返回503状态码。该功能只有Nginx version≥1.3.15的版本才被支持。

  • 使用语法

    limit_conn_zone $variable zone=name:size; 
  • 配置段

    http
  • 默认值

    limit_conn_status 503;

3 注意事项

        凡事都具有两面性,ngx_http_limit_req_module 模块虽可以解决当前面临的并发问题,但也会引入另外一些问题。如前端如果有做LVS或反向代理,而后端启用了该模块功能,那该机器的IP访问会特别频繁,从而导致经常出现503错误,但可以通过设置IP白名单来进行过滤解决该问题,简单配置方式如:

location / {
   # 允许一个IP的访问
   allow 10.1.1.16;
}

4 配置案例

http{
   # 根据客户端IP地址进行统计,设置共享内存大小为20MB,设置固定速率大小为10r/s
   limit_req_zone $binary_remote_addr zone=addr:20m rate=10r/s;
   # 设置并发限流的日志级别为error
   limit_conn_log_level error;
   # 设置触发并发限制时直接返回503状态码
   limit_conn_status 503;

   # ...

   server{
       # ...
       location /limit{
           # 设置每个IP的桶容量为10
           # nodelay表示超额则立即返回503错误
           # 没有配置nodelay表示超过后请求就会排队等待
           limit_req zone=addr burst=10 nodelay;
       }
   }
}


以上是关于微服务架构—Nginx速率限流的主要内容,如果未能解决你的问题,请参考以下文章

nginx浅析4-限流(秒杀,高并发)

微服务治理之降级&限流&熔断

nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)

nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)

nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)

Spring Cloud Zuul微服务网关的API限流