По умолчанию Nginx разрешает имена из конфигов единожды в момент запуска. Это подходит для имён, которые не изменяются месяцами/годами, но если вдруг имя стало разрешаться в другой адрес, то потребуется перезапуск Nginx.
Но если имя сохранить в переменную и потом использовать эту переменную в конфиге, то резолв будет происходить каждый раз при выполнении команды, т.к. Nginx иначе обрабатывает переменные.
Для того, чтобы это работало необходимо в конфиге указать директиву resolver.
Пример:
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
В таком случае Nginx запомнит IP-адрес на TTL секунд (возьмёт из ответа DNS-сервера, обычно это примерно сутки). Можно принудительно уменьшить этот интервал:
resolver 127.0.0.1 [::1]:5353 valid=30s;
Можно отключить резолв имен в IPv6-адреса:
resolver 169.254.169.250 valid=5s ipv6=off;