
nginx レート制限を使用する場合、次のルールを例として使用します。
limit_req_zone $request_limiting_zone_key zone=request_limiting_search:20m rate=30r/m;
これにより、1 分あたり 30 件のリクエストが設定されます。ただし、2 番目のルールをスタックする場合は、ロジックは「1 分あたり 30 件のリクエスト、または 1 秒あたり 1 件のリクエスト。どちらか早い方」になります。
その理由は、1 分あたり 30 回の上限を維持したいものの、1 ~ 2 秒間に 10 倍のリクエストがスパムされるという奇妙な試みがいくつかあるためです。リクエストがこれほど高速に送信されるときに問題が発生します。したがって、ユーザーによるリクエストを 1 秒あたり 1 回に制限し、1 分あたり 30 回という上限を設けたいと思います。
ドキュメントリファレンスを読みましたが、異なるレートルールをスタックすることについてはあまりわかりませんでした。
これは可能ですか? もし可能であれば、構文はどうなりますか?
答え1
同じブロックに複数のゾーンを適用することは完全に有効です。同じキーに対するリクエストを格納する複数のゾーンを作成することもできます(通常はクライアントIPアドレスのプレフィックス)。処理とメモリの消費は最小限です。
以下は、ネットワークアドレスで識別されるユーザーを秒単位と分単位で制限し、定義された制限を一時的に超えることを許可します。バースト信頼性の低い入力デバイスやネットワーク アクセスを持つユーザーにとって、Web サイトが壊れているようには見えないように、これを許可すると、同じリクエストが 2 回発行される可能性があります。
map $remote_addr $request_limiting_zone_key {
# [..]
}
limit_req_zone $request_limiting_zone_key zone=request_limit_search_second:10m rate=1r/s;
limit_req_zone $request_limiting_zone_key zone=request_limit_search_minute:10m rate=30r/m;
# [..]
location /search {
limit_req zone=request_limit_search_second burst=3;
limit_req zone=request_limit_search_minute burst=3;
}
そうは言っても、Web サーバーが検索リクエストの短時間の集中を処理できない場合は、検索エンジンを他のマシンにオフロードするか、別の種類のレート制限を適用する必要があるかもしれません。人間の典型的な使用と機械の能力を超える使用の間には大きな余裕が必要です追いつくために。そうしないと、正当なユーザーを煩わせることと、不正使用やボットの使用を制限できないことの間で安全な値を見つけられない可能性があります。