nginxの ngx_http_limit_req_moduleで転送量制御を行いたい
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;
}