質問: nginxの ngx_http_limit_req_moduleで転送量制御を行いたいとおもっています。 ``` http { limit_req_zone $binary_remote_addr zone=tile_req:20m rate=16r/s; ... server { ... location / { limit_req zone=tile_req burst=45; } ``` のようにした場合、トークンバケットアルゴリズムにより流量制御ができます。`nodelay`をつければ、リーキーバケットアルゴリズム的に動作させられます。 さて、双方の良いとこ取りしたような制御は可能でしょうか。 実現したいのは、同一IPアドレスからのアクセスについて、 1.バーストを許容した平均転送量にあわせて、流量制御したい。 2.長時間(たとえば10分)にわたって、上限値での利用を続けるクライアント(バルク転送しようとしているなど)に対して、http 429レスポンスコードと共に、専用のエラーページを返したい。 の両者を同時に満たすことです。(1)単一は上記設定で実現可能。(2)単一は、1分あたり、1時間あたりであれば、`nodelay`で実現可能。 どちらも単一では実現できますが、両方同時を実現するのは、可能でしょうか? このようにしたら、どうでしょうか? ``` http { limit_req_zone $binary_remote_addr zone=throttle:20m rate=16r/s; limit_req_zone $binary_remote_addr zone=abuse:20m rate=960r/m; ... server { ... location / { limit_req zone=throttle burst=45; limit_req zone=abuse nodelay; } ```
回答: 要望そのままは難しそうな感じがします。 こんな感じで代替案にならないでしょうかね。 * limit_rate と limit_rate_after を使って、一定量転送後は極端に絞る * timeout で一定時間経過したら切る