Cloudflare отслеживает частоту запросов, поддерживая отдельные счётчики для каждой уникальной комбинации значений в характеристики.
Например, рассмотрим правило со следующими характеристиками:
IP-адрес
HTTP-заголовок x-api-key
Если два запроса имеют одинаковый x-api-key значение заголовка, но поступают с разных IP-адресов, Cloudflare учитывает их отдельно, поскольку сочетания их характеристик различаются.
Счётчики не используются совместно между дата-центрами, за исключением дата-центров, относящихся к одному и тому же географическому местоположению.
По умолчанию частота запросов рассчитывается на основе количества входящих запросов. Клиентам с планом Enterprise и Advanced Rate Limiting также может основывать частоту на стоимости обработки каждого запроса. Подробнее см. Ограничение скорости на основе сложности, где это описано подробнее.
Пример A
Рассмотрим следующую конфигурацию правила ограничения скорости:
Правило ограничения скорости №1
Когда входящие запросы соответствуют: http.request.uri.path eq "/form" and any(http.request.headers["content-type"][*] eq "application/x-www-form-urlencoded")
Выберите действие: Block
Длительность (таймаут блокировки): 10 минут
Запросы: 1
Период: 10 секунд
С теми же характеристиками:
ID дата-центра (включено по умолчанию при создании правила в дашборде)
IP
Значение заголовка > x-api-key
Следующая диаграмма показывает, как Cloudflare обрабатывает четыре входящих запроса в контексте описанного выше правила ограничения скорости.
Запрос 1 соответствует выражению правила, поэтому правило ограничения скорости оценивается. Cloudflare определяет счётчик запросов для значений характеристик в контексте правила ограничения скорости и устанавливает этот счётчик в 1. Поскольку значение счётчика находится в пределах лимитов, установленных в Запросы, запрос разрешается.
Запрос 2 соответствует выражению правила, поэтому Cloudflare оценивает правило ограничения скорости. Значения характеристик не совпадают ни с одним существующим счётчиком (значение X-API-Key заголовок отличается). Поэтому Cloudflare определяет отдельный счётчик в контексте этого правила и устанавливает его равным 1. Значение счётчика находится в пределах лимита запросов, установленного в Запросы, поэтому этот запрос разрешён.
Запрос 3 соответствует выражению правила и имеет те же значения характеристик правила, что и запрос 1. Поэтому Cloudflare увеличивает значение существующего счётчика, устанавливая его равным 2. Значение счётчика теперь превышает лимит, заданный в Запросы, поэтому запрос 3 блокируется.
Запрос 4 не соответствует выражению правила, поскольку значение для Content-Type заголовок не соответствует значению в выражении. Поэтому Cloudflare не создаёт новый счётчик правила для этого запроса. Запрос 4 не оценивается в контексте этого правила ограничения частоты запросов и передаётся дальше по цепочке правил в процессе оценки запроса.
Пример B
Рассмотрим следующую конфигурацию правила ограничения скорости. Выражение для подсчёта определяет, что счётчик будет увеличиваться на единицу, когда код состояния HTTP в ответе равен 400:
Правило ограничения скорости №2
Когда входящие запросы соответствуют: http.request.uri.path eq "/form"
Выберите действие: Block
Длительность (таймаут блокировки): 10 минут
Запросы: 1
Период: 10 секунд
С теми же характеристиками:
ID дата-центра (включено по умолчанию при создании правила в дашборде)
IP
Значение заголовка > x-api-key
Увеличивать счётчик, когда:
http.request.uri.path eq "/form" and http.response.code eq 400
Следующая диаграмма показывает, как Cloudflare обрабатывает эти четыре входящих запроса, полученных в течение 10 секунд, в контексте описанного выше правила ограничения скорости.
Запрос 1 соответствует выражению правила, поэтому правило ограничения скорости оценивается. Запрос отправляется на исходный сервер, минуя любой кешированный контент, поскольку правило ограничения скорости включает поле ответа (http.response.code) в выражении подсчёта. Исходный сервер отвечает 400 код состояния. Поскольку есть соответствие выражению подсчёта, Cloudflare создаёт счётчик запросов для значений характеристик в контексте правила ограничения частоты запросов и устанавливает этот счётчик равным 1.
Запрос 2 соответствует выражению правила, поэтому Cloudflare оценивает правило ограничения скорости. Счётчик запросов для значений характеристик по-прежнему находится в пределах максимального количества запросов, заданного в Запросы. Исходный сервер отвечает 200 код состояния. Поскольку ответ не соответствует выражению подсчёта, значение счётчика не увеличивается и остаётся равным (1).
Запрос 3 соответствует выражению правила, поэтому Cloudflare оценивает правило ограничения скорости. Запрос по-прежнему находится в пределах максимального количества запросов, заданного в Запросы. Исходный сервер отвечает 400 код состояния. Есть соответствие выражению подсчёта, которое устанавливает счётчик равным 2.
Запрос 4 соответствует выражению правила, поэтому Cloudflare оценивает правило ограничения скорости. Запрос больше не находится в пределах максимального количества запросов, заданного в Запросы (значение счётчика равно 2 и максимальное число запросов составляет 1). Cloudflare применяет действие, заданное в конфигурации правила ограничения частоты запросов, блокируя запрос 4 и все последующие запросы, соответствующие правилу ограничения частоты запросов, на десять минут.
Ограничение скорости на основе сложности
Не все запросы одинаково затратны для обработки. Простое чтение через API может использовать минимум ресурсов, тогда как сложный запрос к базе данных или экспорт файла может потребовать значительно больше. Ограничение скорости на основе количества запросов рассматривает их одинаково: 100 простых запросов и 100 затратных запросов увеличивают один и тот же счётчик на одинаковую величину.
Ограничение скорости на основе сложности решает эту проблему: оно отслеживает показатель стоимости, который ваш исходный сервер присваивает каждому запросу, и применяет максимальный совокупный показатель на клиента за заданный период. Благодаря этому клиента, отправляющего несколько дорогостоящих запросов, можно ограничить ещё до того, как он достигнет высокого количества запросов, независимо от общего числа отправленных запросов.
Чтобы использовать ограничение частоты запросов на основе сложности, ваш исходный сервер должен возвращать HTTP-заголовок ответа, содержащий числовой показатель для каждого запроса. Этот показатель отражает сложность или стоимость обработки запроса. Значение должно быть от 1 до 1,000,000. Вы указываете, из какого заголовка правило считывает это значение.
Правила ограничения скорости на основе сложности должны содержать следующие свойства:
Оценка за период: Максимальный совокупный балл, допустимый за период. Когда совокупный балл превышает это значение, выполняется действие правила.
Период: Временное окно для оценки суммарного показателя.
Имя заголовка ответа: HTTP-заголовок ответа, устанавливаемый вашим исходным сервером, который содержит оценку для каждого запроса.
Cloudflare ведёт счётчики с суммарной оценкой всех запросов, у которых значения характеристик правила совпадают и соответствуют выражению правила. Оценка увеличивается на значение, предоставленное источником (origin) в ответе, если есть совпадение с выражением подсчёта (по умолчанию оно совпадает с выражением правила). Когда суммарная оценка превышает настроенное максимальное значение оценки за период, применяется действие правила.
Если исходный сервер не передаёт HTTP-заголовок ответа со значением показателя или это значение выходит за пределы допустимого диапазона, соответствующий счётчик ограничения скорости не обновляется.
Пример C
Рассмотрим следующую конфигурацию правила ограничения скорости. При срабатывании правила счётчик показателя сложности будет увеличиваться на основе значения в x-score заголовок ответа, предоставленный исходным сервером.
Правило ограничения скорости №3
Когда входящие запросы соответствуют: (http.request.uri.path eq "/graphql")
С теми же характеристиками:
ID дата-центра (включено по умолчанию при создании правила в дашборде)
Значение заголовка > x-api-key
Когда скорость превышает: На основе сложности
Оценка за период: 400
Период: 1 минута
Имя заголовка ответа: x-score
Выберите действие: Block
Со следующим поведением: Блокировать на выбранный срок
Длительность (таймаут блокировки): 10 минут
Следующая диаграмма показывает, как Cloudflare обрабатывает четыре входящих запроса, полученных в течение одной минуты, в контексте описанного выше правила ограничения скорости.
Запрос 1 соответствует выражению правила, поэтому правило ограничения скорости оценивается. Исходный сервер отвечает 200 код состояния и оценку сложности 100 в x-score HTTP-заголовок ответа. Cloudflare создает счетчик запросов для значений характеристик в контексте правила ограничения скорости и устанавливает этот счетчик в 100.
Запрос 2 соответствует выражению правила, поэтому Cloudflare оценивает правило ограничения скорости. Счётчик запросов для значений характеристик по-прежнему находится в пределах максимального балла за период. Исходный сервер отвечает 200 код состояния, и счётчик запросов увеличивается на 200. Текущий показатель сложности запроса теперь составляет 300.
Запрос 3 соответствует выражению правила, поэтому Cloudflare оценивает правило ограничения скорости. Счётчик запросов для значений характеристик по-прежнему находится в пределах максимального балла за период. Исходный сервер отвечает 200 код состояния, и счётчик запросов увеличивается на 150. Текущий показатель сложности запроса теперь составляет 450.
Запрос 4 соответствует выражению правила, поэтому Cloudflare оценивает правило ограничения скорости. Запрос больше не находится в пределах максимального балла за период, заданного в правиле (значение счётчика составляет 450 и максимальный показатель составляет 400). Cloudflare применяет действие, заданное в конфигурации правила ограничения частоты запросов, блокируя запрос 4 и все последующие запросы, соответствующие правилу ограничения частоты запросов, на десять минут.