rate limiter and rewrite together
Ruslan Ermilov
ru на nginx.com
Ср Ноя 8 19:59:08 UTC 2017
Привет, Дима!
On Wed, Nov 08, 2017 at 08:26:24PM +0300, Dmitry Morozovsky wrote:
> Коллеги,
>
>
> что-то мы мальца сломали мозг и явно не видим очевидного.
>
> Есть ситуация, когда все транзитные HTTP запросы клиента перехватываются и
> отправляются в специальный nginx, котогрый показывает специальную страничку.
>
> Но -- хочется этот поток ограничить, ибо иначе nginx начинает жрать
> процессор как не в себя, потому что клиент-то тупой запросов шлёт гору.
>
> и -- не получается.
>
> текущий вариант был таков:
>
>
> http {
> include mime.types;
> default_type application/octet-stream;
> sendfile on;
> keepalive_timeout 65;
> error_log /var/log/nginx-error.log notice;
> proxy_buffering off;
>
> log_format rdr '[$time_local] $remote_addr [$http_host$request_uri] $server_name $server_port [$rdr] $status $body_bytes_sent';
> limit_req_log_level info;
> limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
>
> server {
> listen 127.0.0.1:8001;
> server_name localhost;
> access_log /var/log/nginx-access.log rdr;
> limit_req zone=one nodelay;
> limit_req_status 444;
> return 302 http://rinet.ru/nomoney/redirect.html?;
> }
> }
>
> не лимитит.
>
> чего мы не замечаем и где тупим? ;)
А не замечаете вы директивы return модуля rewrite, которая не даёт
работать в т.ч. limit_req'у (обработка запроса попросту до нужной
фазы не доходит). Как раз недавно обсуждали подобный юзкейс, ну
и лайфхак какой-то такой будет:
location / {
limit_req zone=one nodelay;
limit_req_status 444;
try_files /nonexistent @redirect;
}
location @redirect {
return 302 http://rinet.ru/nomoney/redirect.html?;
}
P.S. Знак вопроса в конце URI в return остался от rewrite'а, или
так и задумано?
Подробная информация о списке рассылки nginx-ru