IP和Nginx作为反向代理时出错
我将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总是有效的(
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;
...
}
}
}