使用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”?的主要内容,如果未能解决你的问题,请参考以下文章

使用变量复制 proxy_pass 位置行为

nginx:proxy_pass失败时回退到try_files需要不寻常的配置

如何使用 nginx proxy_pass 保留请求 url

启用 SELinux 后 proxy_pass 不起作用,为啥?

启用 SELinux 后 proxy_pass 不起作用,为啥?

Nginx Proxy_pass简述