limit_req_zone and limit_req: rate too strict

Bruno Prémont bruno.premont at restena.lu
Fri Apr 6 19:38:59 UTC 2012


On Fri, 06 April 2012 "Valentin V. Bartenev" <ne at vbart.ru> wrote:
> On Friday 06 April 2012 17:24:52 Bruno Prémont wrote:
> > Hi,
> > 
> > I have started using limit_req_zone + limit_req but am seeing more delayed
> > log entries than I would expect.
> > 
> > I have the following:
> > 
> >   limit_req_zone $binary_remote_addr zone=one:10m rate=3r/s;
> >   ...
> >   server {
> >     ...
> >     location ~ .*\.php$ {
> >         limit_req zone=one burst=10;
> >         ...
> >     }
> > 
> > 
> > In the logs I see that when 2 requests happen near simultaneously from the
> > same IP address (e.g. page redirect to second PHP page or single
> > PHP-generated image referenced by page) the second and third request get
> > delayed if they arrive too early during the same second.
> > 
> > 
> > I would wish to limit the user to 3 requests within a 1s window though
> > not setting any constraint as to spacing between those requests, how can I
> > accomplish it or what changes to limit_req module would be needed to
> > not have a minimum 0.33s spacing between requests for above configuration?
> > 
> 
> http://nginx.org/r/limit_req
> 
>     limit_req zone=one burst=10 nodelay;

In that case legitimate (from my point of view) requests get rejected
which is even worse!

I wish those that fall under rate to not be delayed to get nice distribution
(in my case 1s sample-rate!), but to have those between rate and burst being
delayed to the following seconds.

As an example of what I expect (rate=3r/s, burst=5):
   Time   Request Id
   0.0s     1           initial request
   0.1s     2           second request, should not get delayed
   0.1s     3           third request, should not get delayed
   3.5s     4           new initial request
   3.6s     5           new second request, should not get delayed
   3.7s     6           new third request, should not get delayed
   3.8s     7           new fourth request, should get delayed until t=4.6s
   3.9s     8           new fifth request, should get delayed until t=4.7s
   4.0s     9           new sixth request, should get delayed until t=4.8s
   4.1s    10           new seventh request, should get delayed until t=5.6s
   4.2s    11           new eighth request, should get delayed until t=5.7s
   4.3s    12           new ninth request, should get rejected with 503 (exceeds burst)
   4.4s    13           new tenth request, should get rejected with 503 (exceeds burst)

but I do get like:
   0.0s     1           initial request
   0.1s     2           second request, delayed until 0.33s
   0.1s     3           third request, delayed until 0.66s

Bruno



More information about the nginx mailing list