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