Re: Не работает limit req
Валентин Бартенев
vbart at nginx.com
Fri Jul 11 23:26:52 UTC 2014
On Friday 11 July 2014 19:03:28 nNgzlTtv3k5lzmKRvlmS22tSl8sJr68k wrote:
> Возникла надобность использовать limit_req, но столкнулся с неприятным
> моментом работы ограничителя. В документации приводится пример:
>
> limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
>
> server {
> location /search/ {
> limit_req zone=one;
> }
> }
>
> который (за отсутствием исчерпывающего описания) наталкивает на мысль, что
> указанный limit_req будет ограничивать частоту прихода запросов GET
> /search/, однако на практике это не так.
> Счётчик, указанный директивой limit_req_zone, является глобальным для
> $binary_remote_addr и накручивается независимо от запроса. Из-за этого если
> в одну и ту же секунду от одного и того же IP пришёл какой-то запрос и
> запрос GET /search/, последний будет отклонён - сработает limit_req, хотя он
> был единственным search-ем за эту секунду.
Нет, учитываются только запросы пришедшие в location с limit_req.
>
> Попробовал на опыте - действительно работает не так, как ожидалось:
>
> http {
> limit_req_zone $binary_remote_addr zone=limited:10m rate=1r/s;
>
> server {
> listen 80 default_server;
> location / { return 404; }
> location /123 {
> root /tmp/zzz;
> limit_req zone=limited nodelay;
> }
> }
> }
>
>
> bash$ touch /tmp/zzz/123
>
> bash$ { curl -s -o /dev/null -D - localhost/123; curl -s -o /dev/null -D -
> localhost/123; } | fgrep HTTP
> HTTP/1.1 200 OK
> HTTP/1.1 503 Service Temporarily Unavailable
>
> bash$ { curl -s -o /dev/null -D - localhost/aaaaa; curl -s -o /dev/null -D -
> localhost/123; } | fgrep HTTP
> HTTP/1.1 404 Not Found
> HTTP/1.1 503 Service Temporarily Unavailable
[..]
Попробовал на 1.6.0 ваш пример с вашим конфигом:
% { curl -s -o /dev/null -D - localhost/aaaaa; curl -s -o /dev/null -D - localhost/123; } | fgrep HTTP
HTTP/1.1 404 Not Found
HTTP/1.1 200 OK
Что-то вы не так делаете.
--
Валентин Бартенев
Подробная информация о списке рассылки nginx-ru