IP和Nginx作为反向代理时出错
作者:互联网
我将我的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_pass值不包含变量,则nginx会在加载配置时将域名解析为IP并将其缓存,直到重新启动/重新加载它为止.从性能的角度来看,这是可以理解的.
但是,在动态DNS记录更改的情况下,这可能不是所希望的.因此,根据您拥有或不拥有的许可证,有两种选择.
商业版(Nginx)
在这种情况下,使用上游块并指定需要使用特定解析器定期解析哪个域名.记录TTL可以使用valid = time参数覆盖. 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指令来处理重定向.
标签:nginx,dns,proxy,reverse-proxy,dyndns 来源: https://codeday.me/bug/20191004/1852687.html