NGINX включает ограничение скорости только для успешных запросов

Есть ли способ включить ограничение скорости только для успешных запросов (например, код состояния HTTP 200)?

Например, в следующем фрагменте моей конфигурации...

http {
    limit_req_zone $binary_remote_addr zone=test:10m rate=2r/m;

    server {
        location / {
             limit_req zone=test;
             proxy_pass http://localhost:3000/;
             ...
        }

        ...
    }

    ...
}

... запросы успешно ограничены по скорости (до двух запросов в минуту).

Однако, поскольку это для контактной формы, которая отправляет мне электронные письма, я не забочусь об ограничении скорости, если http://localhost:3000/ возвращает ошибку, поскольку электронное письмо не будет отправлено.


person Zak    schedule 07.04.2018    source источник


Ответы (1)


Нет, нет.

Nginx обрабатывает HTTP-запрос в 11 этапов от запроса на чтение до отправки ответа: пост-чтение, сервер-перезапись, поиск-конфигурация, перезапись, пост-перезапись, предварительный доступ, доступ, пост-доступ, пробные файлы, контент, журнал.

proxy_pass находится в content phase, а limit_req в pre-access phase (см. ngx_http_limit_req_module.c), обработчики pre-access phase выполняются перед обработчиками content phase, поэтому обработчик limit_req не может проверить, в порядке ли код ответа.

person Larry.He    schedule 08.04.2018
comment
Спасибо за ответ, это действительно полезно! Теоретически возможно ли написать плагин, который делал бы это — он мог бы удалять IP-адреса из зоны ограничения скорости, как только обнаружит код ответа не в порядке, возможно, прямо перед фазой регистрации? - person Zak; 08.04.2018
comment
Я не знаю, как написать формальный модуль, чтобы сделать это, но я думаю, что можно изменить исходный код, см. error_page - person Larry.He; 09.04.2018