IP已列入白名单,但出现限速错误

我们正在 Docker 容器中使用 Discourse。我们设置了带有白名单 IP 的速率限制。但是,当我们从该 IP 发出请求时,仍然收到速率限制错误。我确信 nginx 配置是正确的,它看起来是这样的:

geo $limit {
    default 1;
    1.1.1.1 0; # 不是真实的 IP
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=flood:10m rate=12r/s;
limit_req_zone $limit_key zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $limit_key zone=connperip:10m;
limit_conn_status 429;

...
  location @discourse {
    limit_conn connperip 20;
    limit_req zone=flood burst=12 nodelay;
    limit_req zone=bot burst=100 nodelay;
   ...
  }

nginx 配置为在达到速率限制时记录错误,我们确实看到了一些日志消息 - 但没有一条来自白名单 IP。尽管如此,我们仍然收到大量来自白名单 IP 的 429 错误。请求的 URL 是用户配置文件(例如 /users/foo.json)。Discourse 本身是否存在某种速率限制?

2 个赞

您好,Nginx 确实如您所述在管理速率限制,但 Discourse 也有自己的应用程序级别速率限制管理方式。Sam 有一篇关于此的有趣文章:

我唯一想知道的是,我们是否真的可以通过例外情况(即通过这些规则将 IP 列入白名单)来限制速率。我还在寻找方法…… :sweat_smile:

好的,我觉得我有点眉目了:

也许 DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS 正是我们需要的东西 :grin:

1 个赞

我也遇到了每分钟 60 次 API 调用速率限制的问题,似乎无法解决。我已经设置了所有这些:

      - DISCOURSE_MAX_REQS_PER_IP_MODE=none
      - DISCOURSE_MAX_USER_API_REQS_PER_MINUTE=20000
      - DISCOURSE_MAX_USER_API_REQS_PER_DAY=30000
      - DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE=20000
      - DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE=20000
      - DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS=2000
      - DISCOURSE_MAX_ASSET_REQS_PER_IP_PER_10_SECONDS=2000
      - DISCOURSE_SKIP_PER_IP_RATE_LIMIT_TRUST_LEVEL=0
      - DISCOURSE_MAX_ADMIN_API_REQS_PER_KEY_PER_MINUTE=20000
      - DISCOURSE_MESSAGE_BUS_MAX_BACKLOG_SIZE=1000
      - DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS=....

我知道不是 nginx 的问题,因为我收到了“您执行此操作的次数过多”的消息,这意味着 Discourse 的 RateLimiter 正在处理它。

您找到解决方案了吗?

2 个赞