Исключить местоположение из ограничения скорости NGINX

Вопрос или проблема

У меня определены как limit_req_zone, так и limit_req в блоке http nginx, поэтому это будет применяться ко всем блокам сервера и местоположения.

Есть ли способ исключить определенное местоположение или блок сервера из этого ограничения?

nginx.conf:

http {
...
limit_req_zone $binary_remote_addr zone=main:10m rate=25r/s;
limit_req zone=main burst=100 nodelay;
limit_req_status 429;
...
}

myserver.conf:

server {
...
     location /web/ {
     directive_to_disable_ratelimit
     }
...
}

Единственным обходным решением, которое я смог придумать, было установить неприлично высокое значение burst для местоположения или сервера, которое я хочу исключить. Таким образом, фактически ограничение никогда не будет достигнуто.

Эта конфигурация должна работать:

http {
    limit_req_zone $binary_remote_addr zone=main:10m rate=25r/s;
    limit_req_status 429;

    server {
    ...
        location / {
            limit_req zone=main burst=100 nodelay;

            ... другие директивы местоположения
        }

        location /web {
            ... другие директивы местоположения
        }
    }
}

Алгоритм выбора location nginx будет соответствовать первому блоку на все запросы, кроме запросов, совпадающих с /web.

https://nginx.org/r/limit_req_dry_run

Включает режим пробного запуска. В этом режиме скорость обработки запросов не ограничена, однако в зоне общей памяти количество избыточных запросов учитывается как обычно.

Так что если у вас есть следующая конфигурация:

location /web/ {
    limit_req_dry_run on;
}

Запросы, соответствующие /web/*, не будут ограничены, но они все равно будут учитываться в зоне main, и если будет более 25r/s на /web/*, другим местоположениям будет ответено с 429, который вы настроили.

Ответ или решение

Исключение определенного местоположения из ограничения частоты запросов в NGINX

В данной статье мы подробно рассмотрим, как исключить определенное местоположение или серверный блок из политики ограничения частоты запросов в NGINX, используя директивы limit_req_zone и limit_req.

Основные директивы

В конфигурации NGINX, приведенной в вашем вопросе, вы определяете зону ограничения запросов следующим образом:

http {
    limit_req_zone $binary_remote_addr zone=main:10m rate=25r/s;
    limit_req_status 429;
}

Эта конфигурация ограничивает количество запросов до 25 в секунду (r/s) на основе IP-адреса клиента. Запросы, которые превышают установленное ограничение, будут получать статус 429 (Too Many Requests).

Исключение местоположения из ограничения

Для исключения определенного местоположения из общего ограничения частоты запросов вам нужно будет использовать директиву limit_req и явно указать, что для этого местоположения вы не хотите применять ограничения. Вот как это можно сделать:

server {
    ...
    location / {
        limit_req zone=main burst=100 nodelay;
        ... другие директивы местоположения
    }

    location /web/ {
        # Ограничения для этого местоположения не применяются.
        # Можете добавить другие необходимые директивы, если необходимо
    }
}

В этом примере все запросы будет ограничены в основном местоположении, за исключением запросов, относящихся к /web/. Это достигается тем, что для этого местоположения не указана директива limit_req, следовательно, оно не подлежит ограничению.

Альтернативный подход

Как вы уже упоминали, одним из вариантов является установка очень высокого значения для параметра burst, чтобы фактически ограничение никогда не срабатывало. Однако это не самый оптимальный подход с точки зрения ресурсосбережения и управления трафиком. Поэтому использование вышеописанного метода является более предпочтительным.

Использование limit_req_dry_run

Отметим, что есть еще один способ — использование директивы limit_req_dry_run. Эта директива включает режим тестирования, в котором запросы не будут ограничиваться, но будут учитываться в общей зоне. Вот как это можно сделать:

location /web/ {
    limit_req_dry_run on;
}

Запросы, которые соответствуют /web/*, не будут ограничены, но если их количество превышает 25 r/s, это будет учтено, и другие местоположения могут получить статус 429. Эту опцию следует использовать в случаях, когда вы хотите отслеживать нагрузку на определенное местоположение, не применяя к нему ограничения.

Заключение

В NGINX есть несколько вариантов исключения определенного местоположения из правила ограничения частоты запросов. Использование явного определения директивы limit_req только для местоположения, которое должно быть ограничено, является наиболее эффективным подходом. Также вы можете использовать режим limit_req_dry_run, если требуется мониторинг трафика без применения активных ограничений.

Если вы примените эти рекомендации в вашей конфигурации, вы сможете эффективно управлять трафиком и обеспечивать более гибкое распределение нагрузки без ущерба для производительности сервера.

Оцените материал
Добавить комментарий

Капча загружается...