Динамическая маршрутизация в Nginx: продвинутые сценарии с переменными, map и if | AdminWiki

Динамическая маршрутизация в Nginx: продвинутые сценарии с переменными, map и if

27 августа 2026 5 мин. чтения

Динамическая маршрутизация в Nginx решает задачу распределения трафика без перезагрузки конфигурации и без правки статичных location-блоков. Вы можете направить пользователя на нужный бэкенд на основе cookie, заголовка, параметра запроса или IP-адреса. Для этого используются переменные, директива map и ограниченно директива if.

Разберем рабочие схемы: A/B-тестирование, канареечные релизы, условное перенаправление на разные версии API. Каждый пример проверен на практике и снабжен пояснением, где директива if допустима, а где ее лучше заменить на map.

Чем предстоит заниматься

Вы настраиваете Nginx как L7-маршрутизатор, который принимает решение о маршруте в момент обработки запроса. Это отличается от классической статичной конфигурации, где location и proxy_pass зафиксированы заранее. Динамика появляется за счет переменных: Nginx вычисляет значение переменной из запроса, а затем подставляет его в директиву proxy_pass, rewrite или return.

Типичные задачи:

  • разделение пользователей на группы для A/B-теста;
  • постепенный перевод трафика на новую версию бэкенда;
  • маршрутизация по языку, региону или типу клиента;
  • условные редиректы без правки приложения;
  • защита служебных маршрутов по заголовку или cookie.

Для решения этих задач вы комбинируете map, set, if и регулярные выражения. Основной инструмент - map, потому что он вычисляется один раз на этапе чтения конфигурации и не создает нагрузки на каждый запрос.

Что мы ожидаем

От инженера, который внедряет динамическую маршрутизацию, требуется понимание модели обработки запроса в Nginx. Переменные вычисляются в разных фазах: одни доступны на этапе rewrite, другие только в location. Ошибка с фазой дает пустое значение переменной и непредсказуемый маршрут.

Базовый сценарий, который должен работать сразу:

map $http_x_canary $backend {
    default    backend_stable;
    "true"     backend_canary;
}

upstream backend_stable {
    server 10.0.0.10:8080;
}

upstream backend_canary {
    server 10.0.0.11:8080;
}

server {
    listen 80;
    location / {
        proxy_pass http://$backend;
    }
}

Здесь заголовок X-Canary управляет выбором upstream. Заголовок отсутствует - трафик уходит на стабильный бэкенд. Заголовок равен true - на канареечный. Это основа для канареечных релизов.

Будет плюсом

Плюсом будет умение строить маршрутизацию без директивы if внутри location. Директива if в Nginx имеет известные ограничения: она работает в контексте rewrite-модуля и может конфликтовать с try_files или proxy_pass. Безопасная альтернатива - вынести всю логику в map на уровне http.

Пример маршрутизации по cookie с версией приложения:

map $cookie_app_version $app_backend {
    default      backend_v1;
    "v2"         backend_v2;
    "beta"       backend_beta;
}

upstream backend_v1 {
    server 10.0.1.10:8080;
}

upstream backend_v2 {
    server 10.0.1.20:8080;
}

upstream backend_beta {
    server 10.0.1.30:8080;
}

Cookie app_version управляет выбором версии. Пользователь получает v2, если cookie установлена. Для новых пользователей можно задавать cookie на балансировщике или в приложении.

Полезно также уметь комбинировать несколько условий через map на составной переменной:

map "$http_x_region:$cookie_test_group" $route {
    default                 backend_eu;
    "~^ru:"                 backend_ru;
    "~:B$"                  backend_experiment;
    "~^us:B$"               backend_us_experiment;
}

Такой подход позволяет строить многомерные правила без вложенных if.

Задача позиции

Задача позиции - обеспечить управление трафиком на уровне Nginx без изменения кода приложения. Это снижает время выкатки изменений и дает возможность мгновенно откатить эксперимент. Для DevOps-инженера это основной инструмент безопасных релизов.

Ключевые метрики, которые вы контролируете:

  • доля трафика на канареечном бэкенде;
  • время переключения между версиями;
  • количество ошибок 502/504 при переключении;
  • влияние маршрутизации на latency.

Для контроля доли трафика используйте split_clients. Эта директива детерминированно распределяет запросы по весам:

split_clients "${remote_addr}${date_gmt}" $canary_group {
    10%     canary;
    *       stable;
}

map $canary_group $target_backend {
    canary   backend_canary;
    default  backend_stable;
}

10% пользователей попадают на канареечную версию. Распределение стабильно для одного IP в течение суток, что удобно для A/B-тестов.

Ключевые навыки

Первый навык - работа с map. Директива map создает переменную на основе другой переменной. Синтаксис:

map $source_variable $target_variable {
    pattern1   value1;
    pattern2   value2;
    default    fallback;
}

Источником может быть любая переменная Nginx: $http_имя_заголовка, $cookie_имя, $arg_имя, $remote_addr, $request_uri. Паттерны поддерживают точное совпадение, префиксные и регулярные выражения. Регулярные выражения начинаются с ~ или ~* для регистронезависимого поиска.

Второй навык - понимание фаз обработки запроса. Переменные map вычисляются лениво, при первом обращении. Если вы используете map-переменную в proxy_pass, она вычислится в фазе content. Если в rewrite - в фазе rewrite. Это влияет на доступность исходных переменных.

Третий навык - безопасное применение if. Допустимые случаи:

  • return для редиректа;
  • rewrite ... last;
  • установка переменной через set.

Недопустимо оборачивать в if директивы proxy_pass, try_files, add_header. Это приводит к трудноуловимым багам. Если нужно условие для проксирования, используйте map.

Задайте вопрос работодателю

Перед внедрением динамической маршрутизации уточните у работодателя или владельца продукта:

  • какая доля трафика допустима для канареечного релиза;
  • какой признак пользователя использовать для A/B-теста: cookie, заголовок, IP;
  • нужен ли автоматический откат при росте ошибок;
  • какие версии Nginx установлены на проде;
  • есть ли внешний мониторинг upstream-бэкендов.

Ответы определяют конфигурацию. Например, для автоматического отката потребуется active health checks из коммерческой версии Nginx Plus или ручная интеграция с системами мониторинга. В открытой версии Nginx passive health checks срабатывают только после реальных ошибок соединения.

Проверить версию Nginx и доступные модули можно командой:

nginx -V 2>&1 | grep -o 'http_map_module\|http_split_clients_module'

Если модули не собраны, динамическая маршрутизация через map и split_clients будет недоступна.

Где предстоит работать

Динамическая маршрутизация настраивается в конфигурационных файлах Nginx. Основной файл обычно находится по пути /etc/nginx/nginx.conf, дополнительные конфигурации подключаются из /etc/nginx/conf.d/ и /etc/nginx/sites-enabled/. map и split_clients объявляются на уровне http, поэтому их размещают в nginx.conf или в отдельном файле, подключаемом через include.

Структура файлов для крупного проекта:

/etc/nginx/
├── nginx.conf
├── conf.d/
│   ├── maps.conf
│   ├── upstreams.conf
│   └── split_clients.conf
└── sites-enabled/
    └── app.conf

maps.conf содержит все map-директивы. upstreams.conf описывает бэкенды. split_clients.conf задает пропорции трафика. app.conf содержит server-блоки и location-блоки с proxy_pass на переменные.

После изменения конфигурации проверяйте синтаксис перед перезагрузкой:

nginx -t && nginx -s reload

Перезагрузка через сигнал reload выполняется без разрыва соединений, что критично для production.

Вакансии из других подборок

Навыки динамической маршрутизации в Nginx востребованы в вакансиях DevOps-инженеров, системных администраторов и SRE-специалистов. Работодатели указывают их в требованиях к управлению высоконагруженными веб-приложениями и микросервисными архитектурами.

Для углубления в тему рекомендуем изучить руководство по настройке Nginx как L7-маршрутизатора, где разобраны location-блоки, map-директивы и терминация SSL. Практические ответы по кэшированию и zero-downtime деплою собраны в FAQ по администрированию динамического контента. Для контроля состояния Nginx после внедрения маршрутизации используйте шпаргалку по пяти ключевым метрикам мониторинга Nginx.

Для запуска тестовых стендов с Nginx подойдут облачные серверы Timeweb Cloud: VDS/VPS разворачиваются за минуты и позволяют проверить конфигурации map и split_clients на изолированной среде до переноса в production.

Поделиться:
Сохранить гайд? В закладки браузера