前言
我在家里有一台内网服务器,电信宽带有动态的公网IP,所以我配置了DDNS域名,这样公网就可以通过域名访问到家中的内网服务器。
因为电信宽带封禁了常见的80/443端口,所以我在阿里云服务器上配置了Nginx做反向代理,但是发现经常502错误,只有重启Nginx才能恢复,此时内网服务工作正常。
原因
原因在于Nginx反向代理解析DDNS域名时,只会在Nginx启动解析配置文件的时候解析1次,此后就会一直拿着解析到的IP连接upstream。因此,当我的公网IP变化后,Nginx并不会重新去解析DDNS域名,导致连接一个错误的IP。
反向代理Nginx配置文件大概是这样的:
server {
charset utf-8;
listen 80;
server_name a.mysite.com;
index index.html index.htm;
location / {
proxy_pass http://backend.mysite.com:7001;
proxy_redirect off;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 10M;
proxy_busy_buffers_size 20M;
proxy_max_temp_file_size 0;
}
}
阿里云a.mysite.com反向代理给http://backend.mysite.com:7001,然而backend.mysite.com的IP地址一旦变化就会导致无法连接。
解决方法
我希望每次Proxy行为都重新解析IP地址,或者至少可以控制缓存的时间。
要实现这个效果,必须把backend.mysite.com作为变量,这样nginx启动时则不会解析IP,而是运行时解析。
Nginx配置文件修改如下:
server {
charset utf-8;
listen 80;
server_name a.mysite.com;
index index.html index.htm;
resolver 114.114.114.114 valid=1s;
set $proxy_pass_url http://backend.mysite.com:7001;
location / {
proxy_pass $proxy_pass_url;
proxy_redirect off;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 10M;
proxy_busy_buffers_size 20M;
proxy_max_temp_file_size 0;
}
}
每个请求都会动态set变量proxy_pass_url,然后proxy_pass使用变量连接,这样就可以实现每次强制解析IP地址的目的了。
需要配置resolver指定一个DNS服务器,并且还可以指定DNS结果缓存的时间,我这里为了保证IP更新及时性,所以设置了valid=1秒。
问题就此问题得以解决。
温馨提示
本页面最后更新于:2022-11-01 11:33:40,距今已 910 天,若有链接失效或教程无效,欢迎留言反馈。
THE END
版权声明
- 本文标题:美好的明天 - Nginx反向代理DNS缓存问题
- 本文地址:https://www.wmviv.com/archives/469.html
- 转载请保留本文标题、本文地址及链接
- 本站遵循 知识共享《署名—非商业性使用—相同方式共享 4.0 协议国际版》(CC BY-NC-SA 4.0)公共许可协议
- 部分文章来源于网络,仅作为学习展示之用,版权归原作者所有
- 若因文章多次网络流转无法追溯原作者,导致侵犯您的权益,请您 来信告知。