微服务架构—Nginx并发限流

Posted 微技术栈

tags:

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

1 简介

        nginx作为微服务架构的流量接入层,主要使用 ngx_http_limit_conn_module 模块实现请求连接数的限制。主要流程如下:

微服务架构—Nginx并发限流
Nginx-并发限流主要流程

Nginx并发限流的主要流程如下:
① 客户端向Nginx发起请求
② Nginx对当前的并发数进行校验
③ 若超额,则打印日志并返回指定错误码
④ 若未超额,则放通请求并计数

2 核心配置

2.1 limit_conn_zone

        limit_conn_zone 主要用于配置限流key及其存放key对应信息的共享内存区域大小。在Nginx version<1.1.8时使用 limit_zone 来实现并发数的限制。

  • 使用语法

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

    http

2.2 limit_conn

        limit_conn 主要用于配置存放key和其计数器的共享内存区域和指定key的最大连接数。

  • 使用语法

    limit_conn [zone_name] [number]; 
  • 配置段

    http,server,location
  • 案例

    http {
     # 根据远程的客户端IP地址进行统计
     limit_conn_zone $binary_remote_addr zone=addr:20m;
     location /test {
         # 即表示Nginx最多同时并发处理10个连接
         limit_conn addr 10;
     }
    }

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

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

4 配置案例

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

   # ...

   server{
       # ...
       location /limit{
           # 设置每个IP最多允许10个并发
           limit_conn_addr 10;
       }
   }
}


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

服务熔断服务降级服务限流

浅谈微服务架构——容错模式2

Golang微服务的熔断与限流

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

微服务架构实战篇:Spring boot2.x + Guava 并使用RateLimiter实现秒杀限流demo

使用Nginx实现限流