前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接入层限流之ngx_http_limit_req_module

接入层限流之ngx_http_limit_req_module

原创
作者头像
后端老鸟
修改2020-05-11 10:47:44
7320
修改2020-05-11 10:47:44
举报
文章被收录于专栏:服务端技术服务端技术

【转载请注明出处】:https://cloud.tencent.com/developer/article/1626336

ngx_http_limit_req_module模块是Nginx提供的基于漏桶算法实现的请求限流模块,用于对指定KEY对应的请求进行限流,比如按照IP维度限制请求速率。ngx_http_limit_req_module官方文档

配置示例
代码语言:txt
复制
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    limit_conn_log_level error;
    limit_conn_status 503;
    ...
    server {
    ...
    location /limit {
        limit_req zone=one burst=5 nodelay;
    }
  • limit_req:配置限流区域、桶容量(突发容量,默认0)、是否延迟模式(默认延迟);
  • limit_req_zone:配置限流KEY、及存放KEY对应信息的共享内存区域大小、固定请求速率;此处指定的KEY是“$binary_remote_addr”表示IP地址;固定请求速率使用rate参数配置,支持10r/s和60r/m,即每秒10个请求和每分钟60个请求,不过最终都会转换为每秒的固定请求速率(10r/s为每100毫秒处理一个请求;60r/m,即每1000毫秒处理一个请求)。
  • limit_conn_status:配置被限流后返回的状态码,默认返回503;
  • limit_conn_log_level:配置记录被限流后的日志级别,默认error级别。
limit_req的主要执行过程如下所示:
  1. 请求进入后首先判断最后一次请求时间相对于当前时间(第一次是0)是否需要限流,如果需要限流则执行步骤2,否则执行步骤3;
  2. 如果没有配置桶容量(burst),则桶容量为0;按照固定速率处理请求;如果请求被限流,则直接返回相应的错误码(默认503); 如果配置了桶容量(burst>0)且是延迟模式(没有配置nodelay);如果桶满了,则新进入的请求被限流;如果没有满则请求会以固定平均速率被处理(按照固定速率并根据需要延迟处理请求,延迟使用休眠实现); 如果配置了桶容量(burst>0)且非延迟模式(配置了nodelay);不会按照固定速率处理请求,而是允许突发处理请求;如果桶满了,则请求被限流,直接返回相应的错误码;
  3. 如果没有被限流,则正常处理请求;
  4. Nginx会在相应时机进行选择一些(3个节点)限流KEY进行过期处理,进行内存回收。
Nginx配置

定义IP维度的限流区域:

代码语言:txt
复制
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_conn_log_level info; 
limit_conn_status 503;

server {
    listen       8000;
    server_name  localhost;

    location /limit {
       limit_req zone=one burst=5 nodelay;
       proxy_pass http://127.0.0.1:8081; 
    }

}

每秒1个请求,桶容量为5,如果桶满了直接拒绝新请求,且每秒最多1个请求,桶按照固定1秒的速率以nodelay模式处理请求。

使用AB测试工具进行测试,并发数为5个,总的请求数为30个:

代码语言:txt
复制
ab -n 30 -c 5 http://127.0.0.1:8000/limit/test

查看nginx access.log:

image.png
image.png

也可以按照server维度进行限制。

【转载请注明出处】: https://cloud.tencent.com/developer/article/1626336

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置示例
  • limit_req的主要执行过程如下所示:
  • Nginx配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档