Глава 32. Ограничение скорости и полосы¶
Действия ограничения скорости и полосы пропускания управляют нагрузкой и приоритизацией трафика.
32.1. rate_limit(count, period) — лимит запросов¶
Ограничивает количество HTTP-запросов от одного клиента за указанный период времени. Подсчёт ведётся отдельно для каждого IP-адреса клиента. При превышении лимита клиент получает HTTP 429 Too Many Requests, соединение закрывается, upstream-соединение не устанавливается.
Синтаксис:
где:
- count — целое число, максимальное количество запросов в окне
- period — длительность окна:
second,minute,hourилиday(также принимаются сокращения:sec/s,min/m,hr/h,d)
Тип: Условно терминальное. Если лимит не превышен — запрос проходит далее (нетерминальное). При превышении — обработка прекращается (терминальное), клиент получает 429.
Слои и транзакции: Proxy. Применяется к HTTP-транзакциям.
Алгоритм подсчёта:
Используется алгоритм Sliding Window Counter — скользящее окно с двумя счётчиками (текущее и предыдущее окно). Оценка текущей нагрузки вычисляется как взвешенное среднее:
Это обеспечивает: - Точность ~99% без граничных всплесков (boundary burst) - O(1) по памяти (16 байт на пару IP + правило) - O(1) по времени проверки - Автоматический сброс счётчиков при смене политики (reload/install)
Ключ подсчёта: (IP клиента, limit, window). Разные правила с одинаковыми параметрами делят счётчик — это позволяет корректно ограничивать суммарную нагрузку. Разные правила с разными параметрами имеют независимые счётчики.
Поведение при срабатывании:
- Клиент получает HTTP-ответ
429 Too Many Requestsс минимальным HTML-телом - TCP-соединение закрывается (
Connection: close) - Upstream-соединение не устанавливается — проверка выполняется до отправки запроса серверу
- Событие фиксируется в логе:
CPL rate limit exceeded (client_ip=..., limit=..., window_secs=...)
Пример 1
Общий лимит для неаутентифицированных пользователей:
Пример 2
Лимит для конкретного домена:
В этом примере каждый 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) — максимальный битрейт¶
Ограничивает скорость передачи ответа клиенту (замедление). Значения задаются в битах в секунду.
Синтаксис:
где: bitrate — число с опциональным суффиксом (k = x1000, m = x1000000); no — снять ограничение (bps=0).
Тип: Нетерминальное.
Слои и транзакции: Proxy. Применяется к HTTP-ответам.
Пример:
Отличие от bitrate= (условие): max_bitrate() — это действие (ограничивает скорость передачи, замедляя поток данных). bitrate= — это условие (проверяет битрейт потокового видео из HLS/DASH манифеста для принятия решения allow/deny). Они независимы и могут использоваться вместе.
См. также: bitrate= (глава 23), bandwidth_class, priority
32.3. bandwidth_class=class — класс полосы пропускания¶
Назначает запрос в именованный класс полосы пропускания для группового управления. Классы определяются в блоке define bandwidth_class.
Синтаксис:
где: name — имя класса полосы пропускания.
Тип: Нетерминальное.
Слои и транзакции: Proxy. Применяется к HTTP-транзакциям.
Пример:
define bandwidth_class streaming end
<Proxy>
category=Streaming bandwidth_class=streaming
bandwidth_class(low_priority)
См. также: max_bitrate
32.4. priority=N — приоритет¶
В процессе реализации. Значение принимается, но пока не применяется — планировщик приоритетов ещё не подключён.
Устанавливает приоритет обработки запроса. Запросы с более высоким приоритетом обрабатываются в первую очередь при конкуренции за ресурсы.
Синтаксис:
где: N — целое число 0-255 (выше = приоритетнее).
Тип: Нетерминальное.
Слои и транзакции: Proxy.
Пример:
См. также: 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