nginx解析器--dns

nginx解析器--dns,nginx,dns,resolver,Nginx,Dns,Resolver,请原谅一个非常初级的问题 我很难理解nginx“resolver”参数及其工作原理。我已经阅读了文档,搜索了教程和帖子(使用了诸如解析器、nginx和dns之类的关键字),但我仍然不知道如何应用解析器 “配置用于将上游服务器的名称解析为地址的名称服务器…” 根据这个定义,它似乎只是在做名称服务器的工作。 resolver ns1.myhost.com ns2.myhost.com但示例指向 内部/专用IP地址 “地址可以指定为域名或IP地址,以及可选端口…” 这意味着我可以resolve

请原谅一个非常初级的问题

我很难理解nginx“resolver”参数及其工作原理。我已经阅读了文档,搜索了教程和帖子(使用了诸如解析器、nginx和dns之类的关键字),但我仍然不知道如何应用解析器

“配置用于将上游服务器的名称解析为地址的名称服务器…”

  • 根据这个定义,它似乎只是在做名称服务器的工作。
    resolver ns1.myhost.com ns2.myhost.com但示例指向
    内部/专用IP地址
“地址可以指定为域名或IP地址,以及可选端口…”

  • 这意味着我可以
    resolver example.com
    www.example.com(或
    解析器12.34.56.78;
    )但同样,我在文档中没有看到这样的示例
作为一个实际的例子,让我们假设(完全假设:)-我正在构建一个简单的web服务器,上面有几个服务器块


我是否将“解析器”设置为服务器本身的IP?还是服务器局域网中的内部IP?文档似乎建议使用内部IP(127.x.x.x或10.x.x.x)-但是如何设置/确定该IP是什么

解析意味着nginx在解析外部url时应该引用哪个DNS服务器。如果你有下面这样的配置

location / {
    proxy_pass http://www.example.com/abc/def; 
}
location / {
    resolver 192.168.11.10;
    proxy_pass http://machineabc/abc/def; 
}
现在默认情况下,
nginx
将从主机
/etc/resolv.conf
中选择您的解析器,它可能不是您所需要的。可能你想使用谷歌DNS解析器来解决这个问题。然后,您将把nginx配置更新到下面

location / {
    resolver 8.8.8.8;
    proxy_pass http://www.example.com/abc/def; 
}
可能您正在使用本地DNS解析程序在您的本地网络内进行路由,那么您可以使用以下内容

location / {
    proxy_pass http://www.example.com/abc/def; 
}
location / {
    resolver 192.168.11.10;
    proxy_pass http://machineabc/abc/def; 
}
“Resolver”参数定义了DNS服务器的位置,nginx必须使用该服务器来解析在proxy_pass下传递的URL的IP

正如Tarun所解释的,默认情况下,nginx将从主机/etc/resolv.conf中选择解析程序,解析后,它将缓存IP。解析器主要用于两种情况:
1。在专用网络中,解析网络中存在的IP
2。或者在您的代理通行证或上游位置的IP变化非常频繁且您无法依赖nginx缓存IP的地方使用

在您指定的示例中,解析程序将是可以解析您的位置的DNS服务器的IP。这可以是:

1) 127.0.0.1:如果web服务器本身是DNS服务器,则为此需要在该服务器的端口53(默认)上设置DNS服务器

2) x.x.x.x:托管在中的DNS服务器的IP,位于您的专用网络或任何公共DNS服务器中(如果您的URL可公开访问)。你可以使用8.8.8.8(谷歌的公共DNS服务器)

3) 您指定了10.x.x.x:假设您参考的是AWS文档。如果不是,通常情况下,10.x.x.x还需要是DNS服务器IP,在AWS的情况下是10.0.0.2。AWS保留其专有网络的几个IP,第二个IP x.x.x.2保留给DNS服务器。请注意,如果您的VPC不是10.0.0.0/16,此IP将相应更改。例如:假设您的VPC是10.192.0.0/16,那么您将使用10.192.0.2作为解析器

以上参考


如果您想手动设置分辨率,而不使用bind9或dnsmasq等外部工具,还有另一种方法可以实现此目的

location / {
    set $upstream 12.34.56.78;  # desired IP resolution
    proxy_pass  http://$upstream:8080; # desired port
    proxy_set_header Host example.com; # desired host
}

注意:如果
proxy\u pass
的主机部分是静态定义的(即不需要在变量中查找主机),如示例
proxy\u pass所示http://machineabc/abc/def
,则主机将解析一次,时间将在NGNIX启动/重新加载期间。有关更多详细信息,请参阅服务器故障的答案。这与问题无关,最好使用
上游后端{Server 12.34.56.78;}
,因为已知重写模块指令(set)在更复杂的情况下会产生意外行为。