ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: limit_req_zone, переменный rate


  • To: nginx-ru@xxxxxxxxx
  • Subject: Re: limit_req_zone, переменный rate
  • From: Sergej Kandyla <sk.paix@xxxxxxxxx>
  • Date: Thu, 11 Mar 2010 16:45:50 +0200
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:references:in-reply-to :content-type:content-transfer-encoding; bh=Qne3NvXVxmxQYJeSCKj/zOh/NRunMpbnZ0OfJrdQsnY=; b=HAHeWbu+IzAN/HZPCJeDHXQr7mLJY3z4U+2HfaK5NaWFdbO5eFAn/rMoMQ1EgVP5WA F3os5jOxvlnsNQSm7KBXy3FyUSoy4NH4I54bAakkfFHRJJG9FYMUwC9cvzJMk6fzKyCv iZjJpatOwtNw95YaKlmHR5088vM6am9kDtQ6s=
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; b=JJS1vURYGe+JFpMf4jQKt4QSRXAv2PkxddZKwNnVWTuNDucE0AJhM7RoCj/Jir5d+i Rvu9h8LOX+hkOLBYVdxpUWJNKM9sevaji7ps+RMMU6fjmngCdsDEFiR5ZcXUuEhDxqHM KR4s9lycCeeQ0xd7bnUoNaoQxBiibDRW0sFfo=
  • In-reply-to: <20100311131840.GK76989@xxxxxxxxxx>
  • References: <4B98DCED.5030501@xxxxxxxxx> <20100311123326.GI76989@xxxxxxxxxx> <4B98E5A2.6050000@xxxxxxxxx> <20100311131840.GK76989@xxxxxxxxxx>

Maxim Dounin wrote:
Но как направить в различные локейшены указанные айпи,
таким образом чтобы url для end-users был одинаков?

Внутренние редиректы и/или переходы в именованные location'ы всех спасают.

супер! Меня тоже спасло ;) Респект!


Но я обнаружил парочку непонятных моментов.

1) если стоит директива  limit_req_log_level notice;
то в error_log о limits не пишитеся вообще ничего.
(Linux 2.6.18-164.11.1.el5.028stab068.3  nginx/0.8.34)


2)  вместо кода 403

        error_page 403 = @vogons;
       if ($bad) {
           return 403;


можно использовать любой другой код?
вернее со стороны клиента это будет выглядеть легально и прозрачно?


3) неясна логика работы burst.
Провел эксперимент.

конфиг:


limit_req_zone $binary_remote_addr zone=two:10m rate=1r/m;
...
      location @black {
           limit_req zone=two burst=10;
           proxy_pass  http://YYY;
          }

       location / {
           error_page 477 = @black;
           if ($blacklist) {
               return 477;
           }

1r/m выставлен специально для теста.

Делаю подряд запросы с "блеклистнутого" хоста:

# curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.017:2.846:3.422 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.015:3.725:4.006 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.019:4.648:5.069 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.015:5.484:5.873 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.016:6.360:6.631 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.017:7.260:7.611 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.016:8.138:8.754 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.015:8.976:9.454 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.019:9.799:10.461 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.019:10.629:10.969 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/ 0.015:0.030:0.030 # curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://XXX/
0.016:0.031:0.031 #

В error_log:

2010/03/11 16:14:39 [warn] 3412#0: *82 delaying request, excess: 0.876, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:14:45 [warn] 3412#0: *84 delaying request, excess: 1.793, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:14:52 [warn] 3412#0: *86 delaying request, excess: 2.678, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:15:00 [warn] 3412#0: *88 delaying request, excess: 3.544, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:15:07 [warn] 3412#0: *90 delaying request, excess: 4.431, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:15:14 [warn] 3412#0: *92 delaying request, excess: 5.319, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:15:22 [warn] 3412#0: *94 delaying request, excess: 6.201, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:15:30 [warn] 3412#0: *98 delaying request, excess: 7.068, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:15:40 [warn] 3412#0: *100 delaying request, excess: 7.915, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:15:50 [warn] 3412#0: *102 delaying request, excess: 8.751, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:16:01 [warn] 3412#0: *104 delaying request, excess: 9.573, by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:16:13 [error] 3412#0: *106 limiting requests, excess: 9.573 by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX" 2010/03/11 16:16:15 [error] 3412#0: *107 limiting requests, excess: 9.573 by zone "two", client: ZZZ, server: YYY, request: "GET / HTTP/1.1", host: "XXX"


Т.е. как видно на основе ответов курла и записей в error_log,
каждый последующий запрос обрабатывается в среднем на секунду больше, чем предыдущий, по истечению моего burst=10,
получаю 503, что законно.

На сколько я понял документацию:
http://sysoev.ru/nginx/docs/http/ngx_http_limit_req_module.html
"Если скорость запросов превышает описанную в зоне, то их обработка запроса задерживается так, чтобы запросы обрабывались с заданной скоростью. "

каждый мой последующий запрос должен задерживаться на минуту (согласно rate=1r/m) или N минут если это N запрос в пределах burst. В принципе текущее поведение с задержкой на секунду сделано вполне мудро, но вопрос в том, как оно на самом деле должно обрабатываеться.
Фича\баг ?


Спасибо!

    limit_req_zone $binary_remote_addr zone=mostlyharmless:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=vogons:10m rate=1r/m;

    ...

    location / {
        recursive_error_pages on;
        error_page 403 = @vogons;

        if ($bad) {
            return 403;
        }

        limit_req zone=mostlyharmless burst=10 nodelay;

        ...
    }

    location @vogons {
        limit_req zone=vogons burst=1 nodelay;
        ...
    }

Maxim Dounin


_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.