使用proxy_pass时,是不是可以使用/etc/hosts来解析域名而不是“resolver”?
Posted
技术标签:
【中文标题】使用proxy_pass时,是不是可以使用/etc/hosts来解析域名而不是“resolver”?【英文标题】:When using proxy_pass, can /etc/hosts be used to resolve domain names instead of "resolver"?使用proxy_pass时,是否可以使用/etc/hosts来解析域名而不是“resolver”? 【发布时间】:2012-01-08 10:53:04 【问题描述】:在使用 proxy_pass 时可以使用 /etc/hosts 代替 resolver 吗?
我需要对同一台 nginx 机器执行 proxy_pass。有没有办法使用机器的 /etc/hosts 文件来解析域,而不是通过“resolver”属性指定 DNS 服务器?
这将为我节省到达同一服务器所需的额外跃点。我尝试在 /etc/hosts 文件中设置映射到 DNS 的内部 IP,但 nginx 仍在从 resolver 属性中设置的 DNS 服务器读取。或者有没有办法让 HTTPProxy 模块考虑 /etc/hosts 文件设置?
感谢您分享的任何建议..
这是我在 nginx 论坛上发布的同一个问题: http://forum.nginx.org/read.php?11,218997
【问题讨论】:
奇怪的是,如果你使用上游(主机分辨率),这是有效的 Upstream 也对我有用,它是一些额外的代码,但它似乎比下面列出的其他一些方法更干净。 如果使用带有 systemd 的服务器,也可以使用 systemd-resolved 来解决。看到这个答案***.com/a/64909236/153718 【参考方案1】:一种解决方法是使用 Nginx 映射,以便复制 /etc/hosts
内容。
map $wanted_host $wanted_host_ip
default 127.0.0.1;
b.dev.local X.X.X.X;
a.dev.local X.X.X.X;
server
listen 80;
server_name ~^(?P<wanted_port>[0-9]+?)-(?P<wanted_host>.+?)\.HOSTNAME$;
location /
proxy_pass http://$wanted_host_ip:$wanted_port;
这会将 wanted_host
映射到 wanted_host_ip
,就像解析器一样。
【讨论】:
如果有多个(子)域,其中只有一个 IP 不足以知道要访问哪个虚拟服务器,这是否可行? 当然,如果可以解析,您可以将域用作 X.X.X.X。【参考方案2】:您可以通过安装 dnsmasq
并将解析器设置为 127.0.0.1
来解决此问题。基本上,这使用您的本地 DNS 作为解析器,但它只解析它所知道的(其中包括您的 /etc/hosts
)并将其余的转发到您的默认 DNS。
【讨论】:
但遗憾的是dnsmasq
不会自动检测hosts
文件中的更改。你必须发送HUP
。
您能否详细说明我们应该如何设置 dnsmasq 以使我们的 nginx 正确解析其他容器的 dns 名称?只是安装 dnsmasq 并添加 extra_hosts: - "container_name:127.0.0.1" 到我的 docker-compose.yml 配置并没有解决问题
如果您使用的是 docker,我认为 DNS 的工作方式会有所不同,尤其是在您进行容器到容器通信的情况下。查看docker networking configuration 了解更多信息。
这是否适用于其他没有 proxy_pass 的 *nix 风格(特别是 Rasbian)?以上是关于使用proxy_pass时,是不是可以使用/etc/hosts来解析域名而不是“resolver”?的主要内容,如果未能解决你的问题,请参考以下文章
nginx:proxy_pass失败时回退到try_files需要不寻常的配置
如何使用 nginx proxy_pass 保留请求 url
启用 SELinux 后 proxy_pass 不起作用,为啥?