Как ограничить Nginx до 50 запросов в секунду независимо от IP

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

Я ищу способ ограничить Nginx для местоположения по количеству запросов в секунду независимо от исходного IP. Насколько я понимаю, функция ограничения скорости чувствительна к IP, и ее нельзя отключить.

Каков правильный подход в этом случае?

Пример:

limit_req_zone global zone=global_limit:1k rate=50/s;

Часть global – это ключ, который Nginx использует для группировки запросов. Установив его в статическую строку (это может быть что угодно), вместо переменной, все запросы будут попадать в одну и ту же группу.

Чтобы ограничить по IP, вы установите его в $binary_remote_addr. Вы можете ограничивать скорость по практически любому параметру (см. https://www.nginx.com/blog/dynamic-bandwidth-limits-nginx-plus-key-value-store/#Complete-Sample-NGINX-Configuratio для сложного примера).

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

Чтобы ограничить количество запросов к Nginx до 50 в секунду независимо от IP-адреса, необходимо использовать механизм лимитирования запросов, который позволяет контролировать частоту запросов на уровне сервера. В данной ситуации решение заключается в использовании глобальной зоны с одинаковым именем, чтобы объединить все запросы в одну "ведро" для лимитирования.

Шаги для настройки Nginx

  1. Открытие конфигурационного файла:
    Первым делом, нужно открыть основной конфигурационный файл Nginx, который обычно располагается по пути /etc/nginx/nginx.conf, или файл конфигурации вашего виртуального сервера (например, /etc/nginx/sites-available/default).

  2. Определение зоны лимитирования:
    Добавьте следующую строку в секцию http вашего конфигурационного файла:

    limit_req_zone $binary_remote_addr zone=global_limit:1k rate=50r/s;

    В этом случае global_limit – это имя зоны, а 50r/s указывает на желаемую скорость лимитирования запросов (50 запросов в секунду). Заметьте, что мы используем $binary_remote_addr, который идентифицирует IP-адрес клиента, но это имя не повлияет на общий лимит.

  3. Применение лимита в вашем location-блоке:
    Далее добавьте правило лимитирования в соответствующем location блоке:

    location /your_path_here {
       limit_req zone=global_limit burst=10 nodelay;
       # другие директивы конфигурации
    }

    Здесь burst=10 указывает на то, что можно временно превышать лимит на 10 запросов; nodelay позволяет немедленно выполнять запросы до выхода за пределы этого всплеска.

Пример полной конфигурации

http {
    limit_req_zone $binary_remote_addr zone=global_limit:1k rate=50r/s;

    server {
        listen 80;
        server_name your_domain.com;

        location /your_path_here {
            limit_req zone=global_limit burst=10 nodelay;
            proxy_pass http://your_backend;
            # другие директивы
        }
    }
}

Перезагрузка Nginx

После внесения изменений, вам нужно перезагрузить Nginx, чтобы они вступили в силу:

sudo systemctl restart nginx

Заключение

С помощью данной настройки Nginx будет ограничивать количество запросов до 50 в секунду для всех клиентов независимо от их IP-адресов. Это решение позволяет защитить ваш сервер от перегрузок и DDoS-атак, обеспечивая равномерное распределение ресурсов сервера. Убедитесь, что вы тестируете конфигурацию на собранном трафике, чтобы убедиться, что она соответствует вашим требованиям.

Рекомендуется также следить за логами Nginx для анализа производительности и корректности работы настроек лимитирования.

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

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