20

我将我的 Nginx 配置为简单的反向代理。

我只是使用基本设置

location / {
    proxy_pass foo.dnsalias.net;
    proxy_pass_header Set-Cookie;
    proxy_pass_header P3P;
}

问题是一段时间(几天)后,nginx 后面的站点变得无法访问。Indead nginx 尝试调用一个错误的 ip(nginx 后面的站点在我的盒子后面的家中,我正在使用 dyn-dns,因为我的 ip 不固定)。这个 dyn-dns 总是有效的(我可以直接调用我的站点)但是由于不明原因 Nginx 被卡住了..

如前所述,nginx 只是在一段时间后给我 504 Gateway Time-out。当我在家里更改 IP 时,似乎出现了错误。这是错误日志的示例:

[error] ... upstream timed out (110: Connection timed out) while connecting to upstream, client: my.current.ip, server: myreverse.server.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://my.old
.home.ip", host: "myreverse.server.com"

那么你知道为什么 nginx 使用 ip 而不是 DN 吗?

4

2 回答 2

36

如果该proxy_pass值不包含变量,nginx 将在加载配置时将域名解析为 IP 并缓存它们,直到您重新启动/重新加载它。从性能的角度来看,这是完全可以理解的。

但是,如果发生动态 DNS 记录更改,则可能不需要这样做。因此,根据您是否拥有许可证,有两种选择。

商业版(Nginx+)

在这种情况下,使用上游块并指定需要使用特定解析器定期解析的域名。可以使用valid=time参数覆盖记录 TTL。该指令的resolve参数server将强制定期解析 DN。

http {    

    resolver X.X.X.X valid=5s;

    upstream dynamic {
        server foo.dnsalias.net resolve;
    }

    server {

        server_name www.example.com;

        location / {
            proxy_pass http://dynamic;
            ...
        }

    }

}

此功能是在 Nginx+ 1.5.12 中添加的。

社区版(Nginx)

在这种情况下,您还需要一个自定义解析器,就像之前的解决方案一样。但是要解决不可用的上游解决方案,您需要在proxy_pass指令中使用变量。这样 nginx 也将使用解析器,遵守valid参数指定的缓存时间。例如,您可以将域名用作变量:

http {  

    resolver X.X.X.X valid=5s;

    server {

        server_name www.example.com;
        set $dn "foo.dnsalias.net"; 

        location / {
            proxy_pass http://$dn;
            ...
        }

    }

}

然后,您可能需要添加一个proxy_redirect指令来处理重定向。

于 2014-11-16T13:58:52.393 回答
5

也许看看这个http://forum.nginx.org/read.php?2,215830,215832#msg-215832

resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;

In such setup ip address of "foo.example.com" will be looked up
dynamically and result will be cached for 5 minutes.
于 2014-11-16T13:28:30.447 回答