IP地址与Nginx反向代理出现错误

21

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

我只是使用基本设置。

location / {
    proxy_pass foo.dnsalias.net;
    proxy_pass_header Set-Cookie;
    proxy_pass_header P3P;
}
问题在于一段时间后(几天),Nginx 后面的站点就无法访问。实际上,Nginx 尝试调用错误的 IP(Nginx 后面的站点位于我家的盒子后面,我正在使用动态 DNS,因为我的 IP 不固定)。这个动态 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而不是域名吗?

2个回答

36

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

但是,在动态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_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指令来处理重定向。


好的,我会尝试这个解决方案并给出反馈。非常感谢。(社区版) - max54
Xavier Lucas 一段时间后似乎它不起作用了,我的 IP 在更改后仍然是错误的。我遵循了您关于非商业版本的第二条指示。仍需要任何帮助 :/ - max54
@max54 我自己在使用这个设置,它有效,所以这可能是因为您的计算机/网络中的其他原因,这已经超出了最初问题的范围。运行 tcpdump 来确认 DNS 请求是否每个“有效”周期都会发出。因此,在未尝试弄清楚平台上其他问题的情况下,不适合像您这样取消接受答案。 - Xavier Lucas
你是对的,抱歉。我会再仔细检查我的整个配置 :) - max54
这是一个不错的解决方案,但请记住,如果您依赖默认行为,它可能会破坏您的proxy_redirect。 - p3drosola
显示剩余3条评论

5

可以通过在$backend行末尾添加$request_uri来改进此内容。设置$backend为"foo.example.com/$request_uri"。 - sjwoodr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接