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

max*_*x54 15 dns proxy reverse-proxy nginx dyndns

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

我只是使用基本设置

location / {
    proxy_pass foo.dnsalias.net;
    proxy_pass_header Set-Cookie;
    proxy_pass_header P3P;
}
Run Code Online (Sandbox Code Playgroud)

问题是,经过一段时间(几天)后,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"
Run Code Online (Sandbox Code Playgroud)

所以你知道为什么nginx使用ip而不是DN吗?

Xav*_*cas 28

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

但是,在动态DNS记录更改的情况下,这可能不是所希望的.因此,根据您拥有或不拥有的许可证,有两种选择.

商业版(Nginx +)

在这种情况下,使用上游块并指定需要使用特定解析器定期解析哪个域名.记录TTL可以使用valid=time参数覆盖.该指令的resolve参数server将强制定期解析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;
            ...
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

此功能已添加到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;
            ...
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

然后,您可能需要添加proxy_redirect指令来处理重定向.


DOA*_*DOA 5

也许看看这个http://forum.nginx.org/read.php?2,215830,215832#msg-215832

resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;

In such setup ip address of "foo.example.com" will be looked up
dynamically and result will be cached for 5 minutes.
Run Code Online (Sandbox Code Playgroud)