Динамическое разрешение имен DNS в Upstream

Содержание

Обзор

Этот модуль дополняет функциональность разрешения имен DNS в модуля upstream nginx. Оригинальный nginx резолвит доменное имя в блоках proxy_pass или upstream только один раз на этапе парсинга конфигурации. Если IP адрес доменного имени изменяется, то для применения изменений нужно перезагрузить конфигурацию nginx или перезагрузить nginx.
В SEnginx разрешение имен DNS может выполняться в время работы.

Эта функциональность доступна с версии 1.5.10

Директивы

Функция динамического разрешения DNS добавляет несколько новых параметров к директиве proxy_pass: dynamic_resolve, dynamic_fail_timeout, dynamic_fallback.
Если указано dynamic_resolve, то динамическое разрешение имен применяется в этом proxy_pass. Эта функция должна работать вместе с функцией resolver в nginx. Если resolver не задан, то динамическое разрешение имен не будет применяться.
Пример:

resolver 127.0.0.1:53 valid=1;
resolver_timeout 1s;
...
location / {
    proxy_pass http://some_site.org dynamic_resolve dynamic_fail_timeout=30s dynamic_fallback=stale;
}

Параметры dynamic_fail_timeout и dynamic_fallback можно применять с версии 1.5.14.

  • dynamic_fail_timeout используется чтобы задать таймаут с последнего неудачного запроса DNS.
  • dynamic_fallback указывает действие в случае, если запрос DNS завершается неуспешно:
    • next, использовать следующий upstream, это значение по умолчанию;
    • stale, использовать устаревшие данные DNS, обычно это данные последнего успешного запроса к DNS;
    • shutdown, закрыть соединение с клиентом.

В некоторых случаях, даже если указан параметр dynamic_resolve, эта функция не будет работать:

  1. Первый параметр proxy_pass это имя upstream и все серверы в этом upstream указаны IP-адресами;
  2. Первый параметр proxy_pass это URL и имя хоста в этом URL является переменной. В этом случае, nginx по умолчанию будет резолвить имя хоста динамически.

За исключением описанных выше сценариев динамическое разрешение будет работать правильно, но только с определенным алгоритмом балансировки нагрузки. Поддерживаются следующие алгоритмы:

  • round_robin
  • least_conn
  • fastest
  • fair
  • ip_hash


Алгоритмы, которые отсутствуют в этом списке, не будут работать с функцией динамического разрешения имен. Если вы хотите использовать другие алгоритмы, нужно модифицировать их для поддержки функции динамического разрешения имен.
Кроме того, эта функция ограничена использованием только первого IP-адреса в ответе DNS, даже если в нем несколько IP-адресов.

Примеры конфигураций

proxy_pass на upstream

upstream backend {
    server host1.domain1;
    server host2.domain2;
}

resolver 1.1.1.1:53 valid=1;
resolver timeout 1s;

server {
    ...
    location /static_dns {
        proxy_pass http://backend;
    }

    location /dynamic_dns {
        proxy_pass http://backend dynamic_resolve;
    }
    ...
}

IP адреса host1.domain1 и host2.domain2 будут определены и сохранены в конфигурации upstream на этапе персинга конфигурации nginx. Если IP адреса этих доменов изменяются, запросы к /static_dns будут завершаться ошибкой так как senginx будет пытаться соединиться со старым адресом. Но запросы к /dynamic_dns будут проксироваться на новые адреса благодаря функции динамического разрешения имен.

proxy_pass на URL

resolver 1.1.1.1:53 valid=1;
resolver timeout 1s;

server {
    ...
    location /static_dns {
        proxy_pass http://host1.domain1;
    }

    location /dynamic_dns {
        proxy_pass http://host2.domain2 dynamic_resolve;
    }
    ...
}

IP адрес host1.domain1 определяется только при старте или перезагрузке nginx. IP адрес host2.domain2 определяется во время работы, поэтому если адрес меняется, SEnginx будет проксировать запросы на новый адрес.