loop-detect: Поддержка заголовка CDN-Loop для предотвращения циклов запросов
Установка
Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-loop-detect
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-loop-detect
Включите модуль, добавив следующее в верхнюю часть файла /etc/nginx/nginx.conf:
load_module modules/ngx_http_loop_detect_module.so;
Этот документ описывает nginx-module-loop-detect v0.1.0, выпущенный 6 января 2026 года.
http {
# Включите модуль в блоке location
loop_detect on;
loop_detect_cdn_id my_cdn_id;
loop_detect_status 508;
loop_detect_max_allow_loops 10;
server {
listen 80;
server_name example.com;
location / {
proxy_set_header CDN-Loop $loop_detect_proxy_add_cdn_loop;
proxy_pass http://example.upstream.com;
}
}
}
Директивы
loop_detect
Синтаксис: loop_detect on | off;
По умолчанию: loop_detect off;
Контекст: http, server, location
Включает или отключает обнаружение циклов для текущей области. Когда включено, модуль проверяет заголовок CDN-Loop, чтобы отслеживать количество переходов и блокирует запросы, превышающие допустимый лимит.
loop_detect_cdn_id
Синтаксис: loop_detect_cdn_id string;
По умолчанию: loop_detect_cdn_id openresty;
Контекст: http, server, location
Устанавливает уникальный идентификатор для ваших кластеров. Этот идентификатор используется для разбора и отслеживания циклов в заголовке CDN-Loop.
loop_detect_status
Синтаксис: loop_detect_status code;
По умолчанию: loop_detect_status 508;
Контекст: http, server, location
Устанавливает код статуса HTTP, который возвращается, когда запрос превышает допустимый лимит циклов. Код должен быть в диапазоне от 400 до 599 (ошибки клиента или сервера).
loop_detect_max_allow_loops
Синтаксис: loop_detect_max_allow_loops number;
По умолчанию: loop_detect_max_allow_loops 10;
Контекст: http, server, location
Устанавливает максимальное количество допустимых циклов перед блокировкой запроса. Число должно быть больше 0.
Переменные
$loop_detect_current_loops
Возвращает текущее количество обнаруженных циклов, извлеченное из заголовка CDN-Loop. Это значение представляет собой количество переходов, через которые ваш запрос уже прошел через узлы CDN.
$loop_detect_proxy_add_cdn_loop
Конструирует новое значение заголовка CDN-Loop, которое будет отправлено на downstream-прокси. Это значение включает:
- Идентификатор текущего узла CDN и увеличенное количество циклов (например,
my_cdn; loops=2). - Остальные записи из оригинального заголовка
CDN-Loop(если есть).
Пример использования:
location / {
proxy_set_header CDN-Loop $loop_detect_proxy_add_cdn_loop;
proxy_pass http://backend;
}
Как это работает
-
Обнаружение: Модуль разбирает заголовок
CDN-Loop, чтобы определить количество переходов. Каждый переход форматируется как: Формат:Cdn-Loop: <cdn_id>; loops=<count>, ...Пример:Cdn-Loop: my_cdn; loops=2, another_cdn; loops=1. -
Отслеживание: Текущее количество переходов (current_loops) извлекается из заголовка. Модуль увеличивает счетчик и конструирует новое значение
CDN-Loopдля downstream-прокси. -
Блокировка: Если обнаруженное количество циклов превышает
loop_detect_max_allow_loops, NGINX возвращает настроенныйloop_detect_status(например, 508).
GitHub
Вы можете найти дополнительные советы по настройке и документацию для этого модуля в репозитории GitHub для nginx-module-loop-detect.