lua-resty-rate-limit

OpenResty 的速率限制

$ opm get taylorking/lua-resty-rate-limit

OpenResty Redis 支持的速率限制器

这是一个基于 OpenResty Lua 和 Redis 的速率限制器。您可以指定在特定时间段内允许的请求数量,例如,在 10 秒内允许 40 个请求。使用此设置(作为示例),如果您愿意,可以在一秒钟内突发 40 个请求,但必须等待 9 秒才能被允许发出另一个请求。

我们构建它的主要原因之一是能够在整个 API 集群中共享速率限制,而不是在每个实例上单独进行。

lua-resty-rate-limit 被认为是生产就绪的,目前正在为我们的速率限制提供动力 The Movie Database (TMDb).

OpenResty 先决条件

您必须使用 --with-http_realip_module 选项编译 OpenResty。

在您的 nginx.conf 中需要

    http {
        # http://serverfault.com/questions/331531/nginx-set-real-ip-from-aws-elb-load-balancer-address
        # http://serverfault.com/questions/331697/ip-range-for-internal-private-ip-of-amazon-elb
        set_real_ip_from            127.0.0.1;
        set_real_ip_from            10.0.0.0/8;
        set_real_ip_from            172.16.0.0/12;
        set_real_ip_from            192.168.0.0/16;
        real_ip_header              X-Forwarded-For;
        real_ip_recursive           on;
    }

OpenResty 站点配置示例

    # Location of this Lua package
    lua_package_path "/opt/lua-resty-rate-limit/lib/?.lua;;";
    
    upstream api {
        server unix:/run/api.sock;
    }
    
    server {
        listen 80;
        server_name api.dev;
    
        access_log  /var/log/openresty/api_access.log;
        error_log   /var/log/openresty/api_error.log;
    
        location / {
            access_by_lua '
                local request = require "resty.rate.limit"
                request.limit { key = ngx.var.remote_addr,
                                rate = 40,
                                interval = 10,
                                log_level = ngx.NOTICE,
                                redis_config = { host = "127.0.0.1", port = 6379, timeout = 1, pool_size = 100 },
                                whitelisted_api_keys = { "XXX", "ZZZ" } }
            ';
    
            proxy_set_header  Host               $host;
            proxy_set_header  X-Server-Scheme    $scheme;
            proxy_set_header  X-Real-IP          $remote_addr;
            proxy_set_header  X-Forwarded-For    $remote_addr;
            proxy_set_header  X-Forwarded-Proto  $x_forwarded_proto;
    
            proxy_connect_timeout  1s;
            proxy_read_timeout     30s;
    
            proxy_pass   http://api;
        }
    }

配置值

您可以通过更改以下值来自定义速率限制选项

  • key: 用作 Redis 中唯一标识符的值

  • rate: 在指定间隔内允许的请求数

  • interval: 存储桶过期之前的秒数

  • log_level: 设置 Nginx 日志级别。来自此插件的所有错误都将在此处转储

  • redis_config: Redis 主机、端口、超时和池大小

  • whitelisted_api_keys: 要跳过速率限制检查的 API 密钥的 lua 表

许可证

MIT 许可证

版权所有 (c) 2016 Travis Bell

特此免费授予任何获得本软件和相关文档文件(“软件”)副本的人无限制地处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,以及允许获得软件的人这样做,但须符合以下条件:

以上版权声明和本许可声明应包含在软件的所有副本或重要部分中。

软件按“原样”提供,不提供任何明示或暗示的担保,包括但不限于适销性、特定目的适用性和非侵权的担保。在任何情况下,作者或版权持有人均不对因软件或使用或其他处理软件而产生的任何索赔、损害或其他责任负责,无论是在合同、侵权或其他任何法律理论下。

作者

taylorking

许可证

3bsd

依赖关系

luajit

版本