Динамическое разрешение имен 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, эта функция не будет работать:
- Первый параметр proxy_pass это имя upstream и все серверы в этом upstream указаны IP-адресами;
- Первый параметр 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 будет проксировать запросы на новый адрес.