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

Alexey Galygin mif на me.com
Чт Сен 10 14:07:19 UTC 2020


действительно

создал синтетический стенд

как только дописал переменную — всё, резолвинг через hosts отвалился
но это как-то странно, всё же…

error_log  /dev/stderr;

events {
        use epoll;
}

http {
	server {
		server_name _;
		listen 80;

		location /srv_a {
			add_header Host ifconfig.co;
			proxy_pass http://docker_srv_a;
		}

		location /srv_b {
			add_header Host ifconfig.co;
			proxy_pass http://docker_srv_b;
		}

		location /srv_c {
			add_header Host ifconfig.co;
			proxy_pass http://docker_srv_c?$args;
		}
	}
}

> On 10 Sep 2020, at 16:15, Maxim Dounin <mdounin на mdounin.ru> wrote:
> 
> 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://docker_srv_c/> — не может разрешить имя
> 
> Цитата из документации (http://nginx.org/r/proxy_pass/ru <http://nginx.org/r/proxy_pass/ru>):
> 
> : В значении параметра можно использовать переменные. В этом случае, если адрес
> : указан в виде доменного имени, имя ищется среди описанных групп серверов и если
> : не найдено, то определяется с помощью resolver’а.
> 
>> всё же какой-то глюк тут явно есть…
>> что за внутренняя процедура в nginx relover по умолчанию и почему она не полностью следует hosts-файлу?
>> 
>> почему резолвится только часть имён? да и что за чудеса, чем upstream так помогает резолвингу?
> 
> По умолчанию resolver не определён, и при динамическом резолвинге 
> будут работать только IP-адреса, имена upstream'ов и имена, 
> используемые в других частях конфига статически (так как для них 
> создаются неявные upstream'ы).
> 
> -- 
> Maxim Dounin
> http://mdounin.ru/ <http://mdounin.ru/>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org <mailto:nginx-ru на nginx.org>
> http://mailman.nginx.org/mailman/listinfo/nginx-ru <http://mailman.nginx.org/mailman/listinfo/nginx-ru>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20200910/b23877d7/attachment-0001.htm>


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