# 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`错误。