sithmein
(Thorsten Meinl)
1
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
MrBuBBLs
(Philippe Boblet)
2
こんにちは、Nginxはご指摘の通りレート制限を管理していますが、Discourseにもアプリケーションレベルでレート制限を管理する方法があります。サムがこれについて興味深い記事を書いています:
私が疑問に思っているのは、例外(つまり、これらのルールを通じてIPアドレスをホワイトリストに登録する)でレート制限を行うことができるかどうかだけです。まだ方法を探しています… 
MrBuBBLs
(Philippe Boblet)
3
なるほど、何か掴んだかもしれません:
もしかしたら DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS がまさに必要としていたものかもしれません 
「いいね!」 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