系统相关
首页 > 系统相关> > IP和Nginx作为反向代理时出错

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