Nginx反向代理到IP地址频繁切换的DDNS后端

服务器放家里,申请到公网IP挂上DDNS,然后通过VPS上的反向代理绕过80/443端口限制,是比较常见的用法。

这样做的一个不大不小的问题时,家庭宽带一般每一两天就会经历一次公网IP的变动,而变动之后甚至会有十几分钟甚至更长的网络中断。这期间DDNS更新延迟的贡献就不说了,更重要的一块延迟时间,是Nginx更新DDNS解析的延迟。原因是,Nginx在启动的时候会把proxy_pass后面的域名解析结果缓存起来,然后不再变动(这一点存疑,因完我观察到的是十几分钟或者半小时之后它还是会切换);家里服务器的公网IP变了之后,Nginx还是尝试去原来的IP地址拿数据,最终报502错误。

解决方案(待观察验证):

proxy_pass后面的域名设置为变量,并且提供resolver地址给Nginx用来解析:

        #resolver 114.114.114.114 223.5.5.5 valid=36s;
        # 有人说resolver不该放在这里而应该放在大括号里,没仔细验证

        # 设置成一个变量
        set $proxy_pass_url http://xxxxxx.tiger2doudou.com:xxxxx;
        location / {
                # 重要!如果你的服务器有ipv6,但给出的DNS服务器没有,那么一定要加ipv6=off
                resolver 114.114.114.114 223.5.5.5 valid=36s ipv6=off;
                proxy_pass $proxy_pass_url;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-proto https;

                proxy_buffering on;
                proxy_buffer_size 4k;
                proxy_buffers 8 10M;
                proxy_busy_buffers_size 20M;
                proxy_max_temp_file_size 0;
        }

比较重要的一点是,如果你的服务器有ipv6,但给出的DNS服务器没有,那么resolver那一行一定要加ipv6=off,否则日志会报_____ could not be resolved (2: Server failure)错误,返回502错误。

  • 最后更改: 2020/08/27 07:15