Перейти к содержанию

Глава 32. Ограничение скорости и полосы

Действия ограничения скорости и полосы пропускания управляют нагрузкой и приоритизацией трафика.

32.1. rate_limit(count, period) — лимит запросов

Ограничивает количество HTTP-запросов от одного клиента за указанный период времени. Подсчёт ведётся отдельно для каждого IP-адреса клиента. При превышении лимита клиент получает HTTP 429 Too Many Requests, соединение закрывается, upstream-соединение не устанавливается.

Синтаксис:

rate_limit(<count>, <period>)

где:

  • count — целое число, максимальное количество запросов в окне
  • period — длительность окна: second, minute, hour или day (также принимаются сокращения: sec/s, min/m, hr/h, d)

Тип: Условно терминальное. Если лимит не превышен — запрос проходит далее (нетерминальное). При превышении — обработка прекращается (терминальное), клиент получает 429.

Слои и транзакции: Proxy. Применяется к HTTP-транзакциям.

Алгоритм подсчёта:

Используется алгоритм Sliding Window Counter — скользящее окно с двумя счётчиками (текущее и предыдущее окно). Оценка текущей нагрузки вычисляется как взвешенное среднее:

estimated = prev_window_count × (1 - elapsed/window) + curr_window_count

Это обеспечивает: - Точность ~99% без граничных всплесков (boundary burst) - O(1) по памяти (16 байт на пару IP + правило) - O(1) по времени проверки - Автоматический сброс счётчиков при смене политики (reload/install)

Ключ подсчёта: (IP клиента, limit, window). Разные правила с одинаковыми параметрами делят счётчик — это позволяет корректно ограничивать суммарную нагрузку. Разные правила с разными параметрами имеют независимые счётчики.

Поведение при срабатывании:

  1. Клиент получает HTTP-ответ 429 Too Many Requests с минимальным HTML-телом
  2. TCP-соединение закрывается (Connection: close)
  3. Upstream-соединение не устанавливается — проверка выполняется до отправки запроса серверу
  4. Событие фиксируется в логе: CPL rate limit exceeded (client_ip=..., limit=..., window_secs=...)

Пример 1

Общий лимит для неаутентифицированных пользователей:

<Proxy>
    authenticated=no rate_limit(10, minute)
    rate_limit(1000, hour)
    allow

Пример 2

Лимит для конкретного домена:

<Proxy>
    url.domain=api.example.com rate_limit(100, minute)
    allow

В этом примере каждый IP может сделать не более 100 запросов к api.example.com в минуту. Запросы к другим доменам не ограничены.

Пример 3

Разные лимиты по типам пользователей:

<Proxy>
    ; Боты — жёсткий лимит
    user_agent.regex=".*[Bb]ot.*" rate_limit(5, minute)

    ; Анонимные — средний лимит
    authenticated=no rate_limit(30, minute)

    ; Аутентифицированные — мягкий лимит
    rate_limit(300, minute)

    allow

См. также: max_bitrate (32.2), bandwidth_class (32.3), priority (32.4)


32.2. max_bitrate(bps) — максимальный битрейт

Ограничивает скорость передачи ответа клиенту (замедление). Значения задаются в битах в секунду.

Синтаксис:

max_bitrate(<bitrate>|no)

где: bitrate — число с опциональным суффиксом (k = x1000, m = x1000000); no — снять ограничение (bps=0).

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к HTTP-ответам.

Пример:

<Proxy>
    category=Streaming max_bitrate(2m)
    group=VIP max_bitrate(no)
    max_bitrate(500k)

Отличие от bitrate= (условие): max_bitrate() — это действие (ограничивает скорость передачи, замедляя поток данных). bitrate= — это условие (проверяет битрейт потокового видео из HLS/DASH манифеста для принятия решения allow/deny). Они независимы и могут использоваться вместе.

См. также: bitrate= (глава 23), bandwidth_class, priority


32.3. bandwidth_class=class — класс полосы пропускания

Назначает запрос в именованный класс полосы пропускания для группового управления. Классы определяются в блоке define bandwidth_class.

Синтаксис:

bandwidth_class=<name>
bandwidth_class(<name>)

где: name — имя класса полосы пропускания.

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к HTTP-транзакциям.

Пример:

define bandwidth_class streaming end

<Proxy>
    category=Streaming bandwidth_class=streaming
    bandwidth_class(low_priority)

См. также: max_bitrate


32.4. priority=N — приоритет

В процессе реализации. Значение принимается, но пока не применяется — планировщик приоритетов ещё не подключён.

Устанавливает приоритет обработки запроса. Запросы с более высоким приоритетом обрабатываются в первую очередь при конкуренции за ресурсы.

Синтаксис:

priority=<N>
priority(<N>)

где: N — целое число 0-255 (выше = приоритетнее).

Тип: Нетерминальное.

Слои и транзакции: Proxy.

Пример:

<Proxy>
    group=VIP priority=255
    category=Streaming priority=50
    priority=100

См. также: bandwidth_class


Комплексный пример:

<Proxy>
    ; Ограничение скорости для анонимных пользователей
    authenticated=no rate_limit(10, minute)

    ; Ограничение полосы для стриминга
    category=Streaming max_bitrate(2m) priority=50

    ; VIP-пользователи без ограничений
    group=VIP max_bitrate(no) priority=255

    allow