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

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-прокси. Это значение включает:

  1. Идентификатор текущего узла CDN и увеличенное количество циклов (например, my_cdn; loops=2).
  2. Остальные записи из оригинального заголовка CDN-Loop (если есть).

Пример использования:

location / {
    proxy_set_header CDN-Loop $loop_detect_proxy_add_cdn_loop;
    proxy_pass http://backend;
}

Как это работает

  1. Обнаружение: Модуль разбирает заголовок CDN-Loop, чтобы определить количество переходов. Каждый переход форматируется как: Формат: Cdn-Loop: <cdn_id>; loops=<count>, ... Пример: Cdn-Loop: my_cdn; loops=2, another_cdn; loops=1.

  2. Отслеживание: Текущее количество переходов (current_loops) извлекается из заголовка. Модуль увеличивает счетчик и конструирует новое значение CDN-Loop для downstream-прокси.

  3. Блокировка: Если обнаруженное количество циклов превышает loop_detect_max_allow_loops, NGINX возвращает настроенный loop_detect_status (например, 508).

GitHub

Вы можете найти дополнительные советы по настройке и документацию для этого модуля в репозитории GitHub для nginx-module-loop-detect.