Ваш сценарий очень похож на тот, когда используется aws ELB
в качестве восходящих потоков, где resolve
необходим правильный IP-адрес определенного домена.
Первое, что вам нужно сделать и убедиться, чтоявляется то, что DNS-серверы, которые вы используете, могут разрешать ваши домены, тогда вы можете создать свою конфигурацию следующим образом:
resolver 10.0.0.2 valid=300s;
resolver_timeout 10s;
location /foo {
set $foo_backend_servers foo_backends.example.com;
proxy_pass http://$foo_backend_servers;
}
location /bar {
set $bar_backend_servers bar_backends.example.com;
proxy_pass http://$bar_backend_servers;
}
Обратите внимание, resolver 10.0.0.2
это должен быть IP-адрес DNS-сервера, который работает, и ответить на вашзапросы, в зависимости от вашей настройки, это может быть служба локального кэша, например unbound .а затем просто используйте resolve 127.0.0.1
Теперь очень важно использовать переменную для указания имени домена из документов:
Когда вы используетепеременная для указания имени домена в директиве proxy_pass, NGINX повторно разрешает имя домена после истечения его TTL.
Вы можете проверить свой преобразователь, используя такие инструменты, как dig
, например:
$ dig +short stackoverflow.com
В случае, если необходимо использовать keepalive
в восходящем потоке, а если нет возможности использовать Nginx +, то вы можете попробовать openresty балансировщик , вы будетенужно использовать / внедрить lua-resty-dns