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にもアプリケーションレベルでレート制限を管理する方法があります。サムがこれについて興味深い記事を書いています:

私が疑問に思っているのは、例外(つまり、これらのルールを通じてIPアドレスをホワイトリストに登録する)でレート制限を行うことができるかどうかだけです。まだ方法を探しています… :sweat_smile:

なるほど、何か掴んだかもしれません:

もしかしたら DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS がまさに必要としていたものかもしれません :grin:

「いいね!」 1

私も、APIへの呼び出しが1分あたり60回に制限されており、それを緩和できないようです。これらすべてを設定しました。

      - 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