【问题标题】:nginx - limit request rate for URLs containing a variablenginx - 限制包含变量的 URL 的请求率
【发布时间】:2025-12-22 15:15:06
【问题描述】:

我发现ngx_http_limit_req_module可以用来限制每次最大请求数。但据我了解,这适用于整个虚拟位置。我想要的是限制每个任意 URL 的速率。

示例: 我希望在客户端发出一个请求后,针对特定客户端阻止对 /api/list/1/votes 的请求 30 秒。但是,他应该仍然可以调用/api/list/2/votes(但在调用之后,/2 路由也应该被阻塞几秒钟)。 我最初的想法是使用正则表达式为以/votes 结尾的每条路线定义一个位置,但是(在示例中)/1/2 将被阻止,这不是我想要的。

有什么想法吗?

【问题讨论】:

  • 您可以链接位置块。
  • 我不认为这是一个选项,因为潜在路线的数量是无限的,因为 id(上例中的 1 和 2)是一个变量。

标签: nginx


【解决方案1】:

您可以将 nginx 配置设置为这样的内容

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

location ~* ^/api/list/([0-9])/votes$ {
    # apply rate limiting
    limit_req zone=votes burst=5;
}

zone=votes:10m 指定创建一个名为“votes”的共享内存区域来存储访问速率受限 URL 的 IP 地址日志。我们设置rate=1r/s 指定每秒只允许从该IP 提供一个请求。如果来自特定 IP 的队列超过 5 个,burst 参数告诉 Nginx 开始丢弃请求。我放置的正则表达式 ([0-9]) 可以替换为与您的路线匹配的任何正则表达式。

有关限制请求率的更多信息,请参阅 this 博客文章。

【讨论】:

  • 这不会阻止来自客户端的所有与该正则表达式匹配的请求吗?参考上面的示例,我认为您的解决方案也会在调用/api/list/1/votes 之后阻止对/api/list/2/votes 的请求。