resolver: A vs AAAA

Maxim Dounin mdounin на mdounin.ru
Ср Дек 14 17:50:40 UTC 2016


Hello!

On Wed, Dec 14, 2016 at 08:06:31PM +0300, Dmitry Sivachenko wrote:

> > On 14 Dec 2016, at 19:59, Maxim Dounin <mdounin at mdounin.ru> wrote:
> > 
> > Если в конфиге действительно proxy_pass на имя - то при чём тут 
> > resolver?  Первыми будет использоваться IPv4-адреса из-за порядка 
> > сохранения записей, который случается в ngx_inet_resolve_host().
> > 
> > Однако как и в случае resolver'а - порядок ни на что не влияет, 
> > кроме, может быть, отдельных краевых эффектов, т.к. все полученные 
> > адреса будут использоватся и запросы между ними будут 
> > балансироваться по round-robin.
> 
> Допустим, что nginx работает на ipv6-only сервере, а some.ip (аргумент proxy_pass) -- имеет и A, и AAAA.
> Я не хочу чтобы nginx вообще пытался устанавливать соединение к ipv4-адресу.

Если у вас ipv6-only сервер - так и будет, т.к. nginx использует 
getaddrinfo() с флагом AI_ADDRCONFIG, и неподдерживаемые адреса 
система просто не вернёт nginx'у.

> Кроме того, непонятно зачем вообще балансировать между A и AAAA адресами?

Потому что при использовании конструкции

    proxy_pass http://some.domain.name;

nginx получает все адреса для заданного имени и делает между ними 
балансировку по round-robin.  Такое поведение в явном виде 
документировано, http://nginx.org/r/proxy_pass/ru:

: Если доменному имени соответствует несколько адресов, то все они 
: будут использоваться по очереди (round-robin). Кроме того, в 
: качестве адреса можно указать группу серверов.

Такой подход позволяет задавать группы серверов в DNS, а не явно в 
конфиге, и много где используется.  В том числе - именно так 
работает обычная балансировка с помощью нескольких адресов в DNS, 
только клиентов много, а не один, как в случае с nginx'ом.

Какие именно адреса использовать - nginx'у не важно, что есть - то 
и будет использовать.

-- 
Maxim Dounin
http://nginx.org/


Подробная информация о списке рассылки nginx-ru