Nginx 作为微服务架构的流量接入层, 主要使用 ngx_http_limit_req_module 模块实现漏桶算法的请求速率的限制.
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 version1.7.6 的版本才被支持.
使用语法
limit_req_zone [key] zone=[name]:[size] rate=[rate];
配置段
- http
- 2.3 limit_conn_log_level
limit_conn_log_level 主要用于配置被限流后的日志级别, 默认为 error 级别. 该功能只有 Nginx version0.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 version1.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 配置案例
- # 根据客户端 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;
- }
- }
- }
来源: http://server.51cto.com/sOS-570138.htm