nginxの ngx_http_limit_req_moduleで転送量制御を行いたいとおもっています。

https://gist.github.com/miurahr/fe953d47f4148e15e517

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;
    }