Re: резолвятся не все имена host-файла

Maxim Dounin mdounin на mdounin.ru
Чт Сен 10 13:15:06 UTC 2020


Hello!

On Thu, Sep 10, 2020 at 02:48:22PM +0300, Alexey Galygin wrote:

> доброго дня
> 
> хотелось бы всё таки разобраться с вопросом резолвинга имён
> 
> у нас есть докер-контейнер с nginx 1.18.0 с Docker Hub
> в него мы подкладываем в /etc/hosts файл свои несколько записей (условно):
> 
> 10.0.3.4 docker_srv_a
> 10.0.3.5 docker_srv_b
> 10.0.3.6 docker_srv_c
> 
> никакой разницы нет в дальнейшем использовании docker_srv_[a,b,c] в nginx.conf, при этом, srv_a и srv_b работают, а srv_c нет
> 
> проверяли всё до знаков пунктуации — нет разницы в описании, но имя docker_srv_c nginx не видит
> 
> пересборка, дублирование в родительской машинке в /etc/hosts, перезапуски nginx — ничего не помогает
> сам контейнер видит записи (через ping), nginx не видит одну из них — docker_srv_c
> 
> все записи, но в особенности последняя резолвится (ping) в контейнере (docker exec -it nginx ping docker_srv_c), но последняя не резолвится в nginx
> 
> в error log ошибка:
> 
> 2020/09/10 13:24:58 [error] 22#22: *40 no resolver defined to resolve docker_srv_c, client: …, server: …, request: "GET /srv_c/api HTTP/1.1", host: "…"

Ошибка "no resolver defined" как бы говорит нам, что у вас 
конфигурация требует динамического резолвинга адресов (то есть имя 
используется вместе с переменными в proxy_pass).  При динамичеком 
резолвинге невозможно использовать системный резолвер, и 
соответственно не используется файл /etc/hosts.  Вместо этого надо 
либо использовать IP-адреса непосредственно в конфиге nginx'а, 
либо поднять DNS-сервер и указать его с помощью директивы 
resolver.

> перевод строки ещё один на всякий случай добавлял в конец /etc/hosts — не помогло
> 
> далее, поверх этих имён я просто повесил upstream'ы и, все три записи стали видны!
> убираю апстримы, пишу напрямую в proxy_pass http://docker_srv_c — не может разрешить имя

Цитата из документации (http://nginx.org/r/proxy_pass/ru):

: В значении параметра можно использовать переменные. В этом случае, если адрес
: указан в виде доменного имени, имя ищется среди описанных групп серверов и если
: не найдено, то определяется с помощью resolver’а.

> всё же какой-то глюк тут явно есть…
> что за внутренняя процедура в nginx relover по умолчанию и почему она не полностью следует hosts-файлу?
> 
> почему резолвится только часть имён? да и что за чудеса, чем upstream так помогает резолвингу?

По умолчанию resolver не определён, и при динамическом резолвинге 
будут работать только IP-адреса, имена upstream'ов и имена, 
используемые в других частях конфига статически (так как для них 
создаются неявные upstream'ы).

-- 
Maxim Dounin
http://mdounin.ru/


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