IP和Nginx作为反向代理时出错

IP和Nginx作为反向代理时出错,nginx,proxy,dns,reverse-proxy,dyndns,Nginx,Proxy,Dns,Reverse Proxy,Dyndns,我将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配置为简单反向代理

我只是使用基本设置

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网关超时。当我的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吗?

也许可以看看这个


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

但是,在动态DNS记录更改的情况下,可能不需要这样做。因此,根据您是否拥有许可证,有两个选项可用

商业版(Nginx+) 在这种情况下,使用上游块并指定需要使用特定解析器定期解析的域名。可以使用
valid=time
参数覆盖记录TTL。
server
指令的
resolve
参数将强制定期解析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\u 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\u redirect
指令来处理重定向。

听起来不错,我将尝试此解决方案并给出反馈。谢谢。(社区版)我尝试使用多个解析程序,但没有任何效果,解析时我总是得到
recv()失败(111:连接被拒绝),解析程序:X.X.X.X:53
,其中X是我尝试的不同ip地址。(编辑太晚了)我到底应该在解析程序中放置什么?@max54这是另一个问题。这意味着X.X.X.X:53没有任何东西在监听,或者防火墙阻止您访问它。dig foo.dnsalias.net@X.X.X.X的输出是什么?您应该在此指令中设置DNS列表,如
/etc/resolv.conf
中的DNS。Xavier Lucas经过一段时间后,它似乎不起作用,我的ip在更改后仍然是错误的。我遵循了你们关于非商业版的第二条指示。仍然需要帮助:/这可以通过在$backend行的末尾添加$request\u uri来改进。设置$backend“foo.example.com/$request\u uri”;
http {  

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

    server {

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

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

    }

}