Welcome! Log In Create A New Profile

Advanced

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

Sergej Kandyla
March 11, 2010 09:46AM
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@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

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

Sergej Kandyla March 11, 2010 07:08AM

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

Aleksandr Sytar March 11, 2010 07:18AM

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

Maxim Dounin March 11, 2010 07:34AM

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

Sergej Kandyla March 11, 2010 07:46AM

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

Daniel Podolsky March 11, 2010 08:04AM

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

Maxim Dounin March 11, 2010 08:20AM

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

Sergej Kandyla March 11, 2010 09:46AM

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

Maxim Dounin March 11, 2010 11:38AM

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

Sergej Kandyla March 11, 2010 11:58AM

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

Gena Makhomed March 11, 2010 12:52PM

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

Kirill A. Korinskiy March 12, 2010 08:08AM

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

Maxim Dounin March 12, 2010 10:26AM

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

Kirill A. Korinskiy March 12, 2010 10:40AM

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

Maxim Dounin March 12, 2010 11:28AM

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

Kirill A. Korinskiy March 12, 2010 12:16PM

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

Maxim Dounin March 12, 2010 07:20PM

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

Kirill A. Korinskiy March 15, 2010 09:24AM

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

Maxim Dounin March 15, 2010 09:48AM

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

Kirill A. Korinskiy March 15, 2010 10:04AM

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

Sergej Kandyla March 15, 2010 10:12AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 126
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready