

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

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

[code]

    http {
        limit_req_zone $binary_remote_addr zone=tile_req:20m rate=16r/s;
        ...
    server {
        ...
        location / {
             limit_req zone=tile_req burst=45;
    } 
    
[/code]

のようにした場合、トークンバケットアルゴリズムにより流量制御ができます。`nodelay`をつければ、リーキーバケットアルゴリズム的に動作させられます。

さて、双方の良いとこ取りしたような制御は可能でしょうか。

実現したいのは、同一IPアドレスからのアクセスについて、

１．バーストを許容した平均転送量にあわせて、流量制御したい。  
２．長時間（たとえば10分）にわたって、上限値での利用を続けるクライアント（バルク転送しようとしているなど）に対して、http
429レスポンスコードと共に、専用のエラーページを返したい。

の両者を同時に満たすことです。(1)単一は上記設定で実現可能。（２）単一は、１分あたり、１時間あたりであれば、`nodelay`で実現可能。

どちらも単一では実現できますが、両方同時を実現するのは、可能でしょうか？

このようにしたら、どうでしょうか？

[code]

    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;
        }
    
[/code]


CC BY-SA 3.0
2015-01-18T15:03:07.483
4792
2016-04-17T13:18:43.697
2015-01-19T15:43:02.833
7524
7524
question
nginx
nginxの ngx_http_limit_req_moduleで転送量制御を行いたい


要望そのままは難しそうな感じがします。  
こんな感じで代替案にならないでしょうかね。

  * limit_rate と limit_rate_after を使って、一定量転送後は極端に絞る
  * timeout で一定時間経過したら切る


CC BY-SA 3.0
2015-10-20T09:44:08.890
17851
2015-10-20T09:44:08.890
5530
4792
answer