Не работает limit req
nNgzlTtv3k5lzmKRvlmS22tSl8sJr68k
nginx-forum at nginx.us
Fri Jul 11 23:03:28 UTC 2014
Возникла надобность использовать 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-ем за эту секунду.
Попробовал на опыте - действительно работает не так, как ожидалось:
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
Вопрос: как задать ограничение для конкретных запросов ?
К примеру есть задача: все запросы вида ./$ (оканчивающиеся на "/", за
исключением корня) ограничить до 60 запросов/мин для каждого IP. Можно ли с
помощью nginx это сделать ?
Ну и было бы не плохо акцентировать на этом моменте внимание в документации.
Posted at Nginx Forum: http://forum.nginx.org/read.php?21,251661,251661#msg-251661
Подробная информация о списке рассылки nginx-ru