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

Понимание директив ограничения скорости в NGINX

Ключевые директивы ограничения скорости NGINX

NGINX настраивает ограничение скорости с помощью специальных директив, каждая из которых выполняет уникальную функцию:

  • limit_req_zone: Директива limit_req_zone в NGINX устанавливает зону общей памяти для хранения информации об ограничении скорости. Расположенная в контексте http, она определяет допустимую скорость запросов, фактически устанавливая базовый уровень для ограничений скорости.
  • limit_req: Директива limit_req, используемая в контексте местоположения, обеспечивает ограничение скорости, установленное limit_req_zone. Она применяет эти ограничения к определенным местоположениям или URL-адресам, тем самым контролируя частоту доступа к этим конечным точкам.
  • limit_req_status: Директива limit_req_status, размещенная в контексте местоположения, определяет код статуса HTTP, возвращаемый при превышении частоты запросов. Этот механизм обратной связи имеет решающее значение для информирования пользователей или автоматизированных систем о превышении ими допустимой частоты запросов.

Создание конфигурации ограничения скорости

Чтобы реализовать ограничение скорости в NGINX, вставьте соответствующие директивы в файл конфигурации NGINX. Рассмотрим этот простой пример:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    server {
        ...
        location / {
            limit_req zone=mylimit burst=10;
            ...
        }
    }
}

В этой конфигурации директива limit_req_zone устанавливает зону памяти с именем ‘mylimit’, разрешая 5 запросов в секунду (5r/s) с каждого клиентского IP-адреса ($binary_remote_addr). Затем директива limit_req применяет это ограничение скорости к корневому местоположению (/) с пиковой емкостью 10 запросов, предлагая баланс между строгим ограничением скорости и гибкостью для законных пиков трафика.

Ограничение скорости в NGINX: практические примеры

Базовая конфигурация ограничения скорости

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

Пример: ограничение скорости на уровне сервера

Рассмотрим следующую конфигурацию NGINX:

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

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=mylimit burst=5;
            proxy_pass http://backend;
        }
    }
}

Эта конфигурация устанавливает ограничение в 2 запроса в секунду для каждого клиента, как определено его IP-адресом ( $binary_remote_addr). Давайте разберем ключевые компоненты:

  • limit_req_zone: Определяет зону памяти (mylimit) для хранения состояний ограничения скорости размером 10 мегабайт. Устанавливает ограничение скорости в 2 запроса в секунду (2r/s). блок сервера : прослушивает порт 80 на предмет входящего трафика на example.com.
  • location block: Применяет ограничение скорости к корневому URL (/). Параметр burst допускает всплеск до 5 запросов, обеспечивая гибкость для коротких пиков трафика. Директива proxy_pass перенаправляет запрос на указанный внутренний сервер.
  • Burst Parameter: настройка burst=5 в директиве limit_req допускает кратковременное увеличение запросов, до 5 дополнительных запросов сверх установленной скорости. Эта функция имеет решающее значение для обработки внезапных, законных увеличений трафика без влияния на пользовательский опыт. Proxy Pass : директива proxy_pass http://backend; перенаправляет трафик на бэкенд-сервер. Обычно используется в сценариях балансировки нагрузки или когда NGINX действует как обратный прокси.

Примеры расширенного ограничения скорости

Различные лимиты тарифов для разных местоположений

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

Рассмотрим следующую конфигурацию:

http {
    limit_req_zone $binary_remote_addr zone=low:10m rate=1r/s;
    limit_req_zone $binary_remote_addr zone=high:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location /api/low {
            limit_req zone=low burst=3;
            proxy_pass http://backend;
        }

        location /api/high {
            limit_req zone=high burst=20;
            proxy_pass http://backend;
        }
    }
}

Эта конфигурация применяет более низкий предел скорости (1 запрос в секунду) к расположению /api/low и более высокий предел скорости (10 запросов в секунду) к расположению /api/high.

Дополнительные примеры ограничения скорости Nginx

Ограничение скорости на основе типов запросов

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

Вы можете использовать директиву if и переменную $request_method для применения ограничения скорости к определенным типам запросов. Вот пример: