【问题标题】: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 来解决。看到这个答案stackoverflow.com/a/64909236/153718

标签: url-rewriting nginx reverse-proxy


【解决方案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)?
猜你喜欢
  • 2015-07-10
  • 2012-11-06
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多