[SHORT VERSION]我理解当NGINX查看配置文件时,它会对其中的主机名进行DNS查找,然后将结果(主机名应该解析的IP地址)存储在某处并使用它们直到下次它查看一个配置文件(根据我的理解,默认情况下直到下次重启)。 有没有办法看到我当前运行的NGINX服务有这个主机名到ips的映射?我知道有一些方法可以配置我的NGINX来解释主机名IP的变化。我希望看我的NGINX 当前认为它应该解析我的主机名。
[详解]我使用AWS ELB的DNS名称(经典)作为proxy_pass的主机名。由于AWS ELB的公共IP和私有IP都可以更改(不另行通知),因此NGINX在其服务开始时为该主机名映射的任何IP都将在此类更改后过时。我认为IP更改刚好发生在我身上,因为我的NGINX服务正在将流量转发到与其配置中指定的群集不同的群集。重新启动NGINX服务可以解决问题。但是,再一次,我希望看到NGINX目前认为应该将流量发送到哪里,而不是如何修复它或阻止它(有大量资源在线处理动态上游,我显然应该先消耗它们部署我的NGINX服务......)。
提前谢谢!
答案 0 :(得分:1)
您只需要resolver
选项。
http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
使用此选项,nginx将在不重新启动的情况下查找DNS更改。但仅适用于proxy_pass
指令。如果您使用upstream
,这将不起作用。仅在Nginx PLUS版本中支持的上游服务器的DNS解析。
如果你想知道上游服务器的IP,几乎没有办法:
- 在PLUS版本中,您可以使用状态模块或upstream_conf模块,但PLUS版本不是免费的
- 一些第三方状态模块
- 将此IP写入每个请求的日志,只需将$upstream_addr
变量添加到自定义访问日志中。 $upstream_addr
包含当前请求中使用的后端服务器的IP地址。配置示例:
log_format upstreamlog '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent $upstream_addr';
server {
...
access_log /tmp/test_access_log upstreamlog;
resolver ip.of.local.resolver;
location / {
set $pass dns_name.of.backend;
proxy_pass http://$pass;
}
}
注意:始终使用proxy_pass
的变量 - 仅在这种情况下使用resolver
。日志示例:
127.0.0.1 - - [10/Jan/2017:02:12:15 +0300] "GET / HTTP/1.1" 200 503 213.180.193.3:80
127.0.0.1 - - [10/Jan/2017:02:12:25 +0300] "GET / HTTP/1.1" 200 503 213.180.193.3:80
.... IP address changed, nginx wasn't restarted ...
127.0.0.1 - - [10/Jan/2017:02:13:55 +0300] "GET / HTTP/1.1" 200 503 93.158.134.3:80
127.0.0.1 - - [10/Jan/2017:02:13:59 +0300] "GET / HTTP/1.1" 200 503 93.158.134.3:80