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

loop-detect: Поддержка заголовка CDN-Loop для предотвращения циклов запросов

Установка для Debian/Ubuntu

Эти документы относятся к APT пакету nginx-module-loop-detect, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте репозиторий APT, как описано в настройке репозитория APT.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-loop-detect
Показать наборы и архитектуры
| Дистрибутив | Версия            | Компонент   | Архитектуры   |
|-------------|-------------------|-------------|----------------|
| debian      | bookworm          | main        | amd64, arm64   |
| debian      | bookworm-mainline | main        | amd64, arm64   |
| debian      | trixie            | main        | amd64, arm64   |
| debian      | trixie-mainline   | main        | amd64, arm64   |
| ubuntu      | focal             | main        | amd64, arm64   |
| ubuntu      | focal-mainline    | main        | amd64, arm64   |
| ubuntu      | jammy             | main        | amd64, arm64   |
| ubuntu      | jammy-mainline    | main        | amd64, arm64   |
| ubuntu      | noble             | main        | amd64, arm64   |
| ubuntu      | noble-mainline    | main        | amd64, arm64   |

ngx_http_loop_detect_module позволяет NGINX использовать заголовок CDN-Loop для предотвращения циклов запросов.

Содержание

Статус

Этот модуль Nginx в настоящее время считается экспериментальным. Проблемы и запросы на изменение приветствуются, если вы столкнетесь с какими-либо проблемами.

Сводка

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. Это значение представляет собой количество пересылок, через которые уже прошел ваш запрос.

$loop_detect_proxy_add_cdn_loop

Конструирует новое значение заголовка CDN-Loop, которое будет отправлено вниз по цепочке прокси. Это значение включает:

  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 для прокси ниже по цепочке.

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