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 配置案例
- # 根据客户端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;
- }
- }
- }
在去年美国大选时,有一个热门人物希拉里爆出一个邮件事件,其原因是她使用的服...
一 分布式存储系统背景 副本是分布式存储系统中的常见概念:将一定大小的数据按...
目录: 1 从零开始 2 基于本机内存的缓存 3 服务端的Redis 3.1 持久化(Persisten...
高防服务器是什么 ?可能大多数站长都听说过它,也知道它是用来防御网络攻击的,...
【51CTO.com原创稿件】2月25日消息,致力于驱动在华企业释放数据潜能并加速数字...
相信大家对于香港服务器都不陌生,距离大陆近、国际网络线路、稳定性好访问速度...
香港云主机这么受欢迎?这些香港云主机租用小技巧你知道吗?首先我们在选择香港...
因为很多实验都要在工作站上面运行,为了避免拿着装着数据的硬盘在自己电脑和工...
几年来,一些人已经预测无服务器计算将迎来一个新的计算时代,我们被告知该框架...
本文转载自微信公众号「SH的全栈笔记」,作者SH 。转载本文请联系SH的全栈笔记公...