Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
то ждем ваше обращение в нашей службе тех поддержки.
Для настройки веб-сервера NGINX необходимо использовать функцию Rate limit, которая позволяет ограничить количество HTTP запросов от пользователей в определенный промежуток времени. Лимиты могут быть применены к простым GET запросам домашней страницы сайта или к POST запросам формы логина. Эта функция может быть использована для усиления безопасности, например, для замедления перебора паролей для злоумышленника или для предотвращения DDoS атаки, снизив количество входящих запросов до типичных значений для пользователей. Также можно определять атакуемые URL по логам.
Для работы функции Rate limit следует использовать модуль ngx_http_limit_req_module.
Шаг 1: limit_req_zone
Для описания лимитов, которые будут использоваться для ограничения числа пользовательских запросов в локации, необходимо создать зону, в которой будут храниться данные (количество запросов с каждого IP). Для этого следует использовать директиву limit_req_zone, которая описывается в http секции конфигурации и может использоваться во множестве контекстов.
Пример:
Добавляем директиву limit_req_zone в блок http {} файла nginx.conf:
...
limit_req_zone $binary_remote_addr zone=backend_oauth:10m rate=5r/m;
...
В данном примере:
- $binary_remote_addr - переменная с IP клиента
- zone=backend_oauth:10m - создается зона памяти с именем backend_oauth и размером 10 мегабайт (размер $binary_remote_addr можно узнать в ngx_stream_limit_conn_module)
- rate=5r/m - максимальное количество запросов в минуту
Параметры директивы limit_req_zone:
- Key - характеристика запросов для их группировки. В примере выше используется системная переменная $binary_remote_addr, которая содержит бинарные представления IP-адресов пользователей. Это означает, что лимиты из третьего параметра будут применяться к каждому уникальному IP-адресу клиента из запроса.
- Zone - зона разделяемой памяти, которая используется для хранения состояний IP-адресов и количества их обращений к URL-адресам. Эта память является общей для всех процессов NGINX.
- Rate - максимальное количество запросов.
Шаг 2: limit_req
Для окончательной настройки необходимо добавить в блоки location или server директиву limit_req. Для этого в конфигурационном файле виртуального хоста создается location, который хотим ограничить, и в него добавляется limit_req.
Пример:
...
location /v3/user/oauth/refresh_token {
limit_req zone=backend_oauth burst=20 nodelay;
limit_req_status 429;
}
...
В данном примере:
- Лимиты применяются для локации /v3/user/oauth/refresh_token в блоке server нашей конфигурации.
- Каждый запрос, который приходит чаще, чем установленное ограничение, будет помещен в очередь, размер которой 20 запросов, установлен параметром burst.
Назад в раздел
Для работы функции Rate limit следует использовать модуль ngx_http_limit_req_module.
Шаг 1: limit_req_zone
Для описания лимитов, которые будут использоваться для ограничения числа пользовательских запросов в локации, необходимо создать зону, в которой будут храниться данные (количество запросов с каждого IP). Для этого следует использовать директиву limit_req_zone, которая описывается в http секции конфигурации и может использоваться во множестве контекстов.
Пример:
Добавляем директиву limit_req_zone в блок http {} файла nginx.conf:
...
limit_req_zone $binary_remote_addr zone=backend_oauth:10m rate=5r/m;
...
В данном примере:
- $binary_remote_addr - переменная с IP клиента
- zone=backend_oauth:10m - создается зона памяти с именем backend_oauth и размером 10 мегабайт (размер $binary_remote_addr можно узнать в ngx_stream_limit_conn_module)
- rate=5r/m - максимальное количество запросов в минуту
Параметры директивы limit_req_zone:
- Key - характеристика запросов для их группировки. В примере выше используется системная переменная $binary_remote_addr, которая содержит бинарные представления IP-адресов пользователей. Это означает, что лимиты из третьего параметра будут применяться к каждому уникальному IP-адресу клиента из запроса.
- Zone - зона разделяемой памяти, которая используется для хранения состояний IP-адресов и количества их обращений к URL-адресам. Эта память является общей для всех процессов NGINX.
- Rate - максимальное количество запросов.
Шаг 2: limit_req
Для окончательной настройки необходимо добавить в блоки location или server директиву limit_req. Для этого в конфигурационном файле виртуального хоста создается location, который хотим ограничить, и в него добавляется limit_req.
Пример:
...
location /v3/user/oauth/refresh_token {
limit_req zone=backend_oauth burst=20 nodelay;
limit_req_status 429;
}
...
В данном примере:
- Лимиты применяются для локации /v3/user/oauth/refresh_token в блоке server нашей конфигурации.
- Каждый запрос, который приходит чаще, чем установленное ограничение, будет помещен в очередь, размер которой 20 запросов, установлен параметром burst.
- Параметр nodelay выделяет очередь для каждого потока запросов.
Данная инструкция описывает, как настроить ограничение частоты запросов в Nginx, чтобы предотвратить перегрузку сервера. Одним из способов является использование директивы limit_req, которая позволяет устанавливать лимиты на основе URL, IP-адресов и других параметров.
По умолчанию Nginx возвращает код 503 (Service Temporarily Unavailable), если клиент превысил допустимые лимиты. Однако, можно изменить этот код на другой, используя директиву limit_req_status. Например, в примере 429 Too Many Requests.
Для настройки ограничения частоты запросов необходимо определить "ведро" (bucket) - разделяемое пространство, в котором считаются входящие запросы. Все запросы, попавшие в одно "ведро", будут посчитаны и обработаны в его разрезе. Это достигается с помощью параметра zone.
Также можно использовать параметр burst, который настраивает количество запросов, которые пользователь может сделать прежде, чем лимиты будут применены и Nginx начнет отбрасывать запросы. Важно понимать, что burst - это абсолютная величина количества запросов, а не скорость.
Для того чтобы Nginx не делал паузы в отправках запросов из очереди, можно использовать параметр nodelay. Он используется совместно с burst и говорит Nginx, что он должен принимать пакеты в рамках окна, определенного значением burst, и сразу их обрабатывать (так же как и обычные запросы). В результате всплески трафика все же будут достигать сервисов, расположенных за Nginx, но эти всплески будут ограничены значением burst.
После настройки параметров необходимо сохранить и закрыть файл конфигурации виртуального хоста. Затем перезапустите Nginx, чтобы изменения вступили в силу.
По умолчанию Nginx возвращает код 503 (Service Temporarily Unavailable), если клиент превысил допустимые лимиты. Однако, можно изменить этот код на другой, используя директиву limit_req_status. Например, в примере 429 Too Many Requests.
Для настройки ограничения частоты запросов необходимо определить "ведро" (bucket) - разделяемое пространство, в котором считаются входящие запросы. Все запросы, попавшие в одно "ведро", будут посчитаны и обработаны в его разрезе. Это достигается с помощью параметра zone.
Также можно использовать параметр burst, который настраивает количество запросов, которые пользователь может сделать прежде, чем лимиты будут применены и Nginx начнет отбрасывать запросы. Важно понимать, что burst - это абсолютная величина количества запросов, а не скорость.
Для того чтобы Nginx не делал паузы в отправках запросов из очереди, можно использовать параметр nodelay. Он используется совместно с burst и говорит Nginx, что он должен принимать пакеты в рамках окна, определенного значением burst, и сразу их обрабатывать (так же как и обычные запросы). В результате всплески трафика все же будут достигать сервисов, расположенных за Nginx, но эти всплески будут ограничены значением burst.
После настройки параметров необходимо сохранить и закрыть файл конфигурации виртуального хоста. Затем перезапустите Nginx, чтобы изменения вступили в силу.
Назад в раздел
Подписаться на новые материалы раздела: