SimpleRateLimiter#
Действие SimpleRateLimiter ограничивает возможное количество запросов согласно установленному лимиту на указанный период времени. Если лимит превышен, то запросы блокируются
Параметры:
Название |
Обязательность |
Допустимые значения |
Описание |
|---|---|---|---|
rules |
+ |
Последовательность значений вида: |
Используется в случае: |
В отличие от директивы limit_req, данный счетчик не предполагает функций сглаживаний. Принцип его работы следующий:
Если счетчик, в момент получения запроса, не инициализирован, то он инициализируется начальным значением равным 1.
Каждый следующий запрос увеличивает значение счетчика, ассоциированное со значением ключа на указанный инкремент.
По истечении периода времени с момента отправки первого запроса, указанного в лимите периода времени, счетчик сбрасывается и переходит в неинициализированное значение.
Значение ключа формируется следующим образом:
Если не указан флаг
global, то ключ формируется в виде{service_id}_{key}_{limit}, имя зоны счетчика (в модуле статистики) в этом случае будет иметь значениеslr_{service_id}_{key}_{limit}.Иначе, ключ имеет значение
profile_{key}_{limit}, а имя зоныslr_profile_{key}_{limit}.
С практической точки зрения, это означает, что в случае установки global в true, если ключ с одним и тем же значением указать в разных сервисах, то он будет общим для этих двух сервисов, т.е. если запросы, приходящие на оба этих сервиса, одновременно будут увеличивать значение счетчика.
Важно учитывать - если используется одна и та же зона с разными значениями лимитов, то в метрике limit для данного ключа будет указываться максимальное значение лимита.
Примеры:
- actions:
- action: SimpleRateLimiter
conditions:
- var: $request_method
val: POST
operator: '='
params:
rules:
- key: limit
limit: 10
period: 1m
В данном примере для POST-запросов установлен лимит в 10 запросов в минуту.
- actions:
- action: SimpleRateLimiter
conditions:
- var: $request_method
val: POST
operator: '='
params:
rules:
- key: limit_post
limit: 10
period: 1m
- action: SimpleRateLimiter
conditions:
- var: $request_method
val: GET
operator: '='
params:
rules:
- key: limit_get
limit: 10
period: 1m
В данном примере лимиты применяются для запросов в разрезе методов - т.е. 10 запросов в минуту для запросов с методом GET, 10 запросов в минуту для запросов с методом POST.
- actions:
- action: SimpleRateLimiter
conditions:
- var: $request_method
val: POST
operator: '='
params:
rules:
- key: limit
limit: 10
period: 1m
- action: SimpleRateLimiter
conditions:
- var: $request_method
val: GET
operator: '='
- var: $remote_addr
val: 192.168.0.1
operator: '!='
params:
rules:
- key: limit
limit: 10
period: 1s
В этом примере счетчик с ключом limit увеличивается на 1 в том случае, если запрос пришел с методом POST или методом GET и с ip адреса не равным 192.168.0.1, при этом лимит составляет 10 запросов в минуту для POST запросов и 10 запросов в секунду для GET запросов. Важно - так ключ определяется как ключ + период, они не пересекаются.