【问题标题】:How do you implement basic nginx rate limiting?你如何实现基本的nginx速率限制?
【发布时间】:2021-12-12 08:42:47
【问题描述】:

我正在尝试为使用 Nodejs 构建并部署在 DigitalOcean droplet 上的 API 测试基本的 nginx 速率限制设置。

我预计当客户端每分钟发出超过 1 个请求时会返回 503 错误(测试的下限)。目前,客户可以继续提出任意数量的请求。

nginx.conf 中,我尝试在http 块中包含以下内容-

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {

        location / {
            limit_req zone=one burst=5;
        }

我还尝试通过添加单独的 httpserver 块将上述内容包含在 /etc/nginx/sites-available/default 文件中。

我已经参考了这些资源 - resource 1resource 2

非常感谢任何和所有帮助。如果我可以提供更多信息来帮助澄清我的问题,请告诉我。

更新

/etc/nginx/sites-available/default 的以下配置更新似乎已经解决了这个问题。

在我包括的主要上下文中:

# Rate Limiting
limit_req_zone $binary_remote_addr zone=by_ip:10m rate=7r/s;

在嵌套在我包含的服务器上下文中的位置上下文中:

server {

        root /var/www/html;

        server_name <SERVER NAMES>;

        location / {
                limit_req zone=by_ip;
                proxy_pass http://localhost:<PORT VALUE>;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}

【问题讨论】:

    标签: nginx nginx-config rate-limiting


    【解决方案1】:

    您提供的 nginx-configuration sn-p 将限制每 秒 1 个请求的速率 (rate=1r/s)

    使用burst=5-设置,您还将打开一个包含 5 个条目的“队列”。这意味着客户端可以连续发出 5 个请求,进一步的请求将获得 1 秒的“延迟”,但仍会通过。

    如果您的目标是设置每分钟 1 个请求的“硬”限制,您需要以下配置:

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
    
    server {
    
        location / {
            limit_req zone=one nodelay;
        }
    }
    

    重要的是rate=1r/m 将速率限制设置为每分钟 1 个请求。 (这是 nginx 支持的最低设置。)

    那么nodelay 表示,您将在这一分钟内使用503(速率限制的默认状态代码)取消任何进一步的请求。

    【讨论】:

    • 感谢@DanEEStar 的明确回复。我已经实现了上述配置,但问题仍然存在。在我原来的帖子中,我没有明确提到我使用 nginx 作为 nodeJS 服务器的代理。如果这不明显,这会改变我应该如何配置速率限制吗?我读了this 文章,表明它不会。再次感谢。
    • 如果它是代理,它应该不会有什么不同......不同的location-config 可能会干扰。如果您可以添加更多现有配置,这可能会有所帮助。
    • 感谢您的来信。我更新了最初的帖子以包括对似乎有效的配置的更改。我现在遇到的问题是在使用 Postman 进行测试时,当超出请求限制时,我得到了预期的 503 错误,但是,当从实时站点发出请求时,控制台错误是 CORS 错误,奇怪的是,在网络中选项卡的常规标题的状态代码为 503。为什么控制台会记录 CORS 错误?也许这应该是单独的帖子。
    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2015-06-21
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多