技术解析

nginx 如何反代 ddns 网站?
0
2021-05-20 22:57:54
idczone
假设我有一个 ddns 域名 ddns.domain.com ,但是由于运营商原因屏蔽了 443 和 80 端口,所以只能用端口 4430,
但是输入域名还要输入端口好麻烦,所以像配置个反代,home.domain.com 。
我 nginx 配置写的是 prox抗投诉服务器y_pass https://ddns.domain.com:4430

确实好使,但是问题来了,路由器重新拨号的时候 ddns.domain.com 的 ip 变了,反代域名 ddns.domain.com 就挂了,出现 504 网关错误。
怀疑是 nginx 有 dns 缓存。求问如何解决。
你确定 ddns 搞好了,重新拨号你 ddns 解析更新没有。这锅感觉和 nginx 无关系

当然确定,ping ip 变了,curl home.domain.com 返回结果也正确。然后 curl ddns.domain.com 卡住

上面说反了,反正就是原始 ddns 域名好使,配置的反代域名不好使。

问个无关的问题,为什么这个主题我不能编辑了,也不能追加,是因为我又发布了一个新主题吗?有错别字不能改好别扭……

http://google.com/search?newwindow=1&safe=off&q=nginx%20dns%20cache&gws_rd=ssl
随便乱搜好像也有答案。

nginx 没有自己的 dns 缓存,我也是反代 ddns 的域名,没有问题。
实在不行,直接去你 ddns 的域名解析服务器查最新的 IP,然后替换配置文件中的 IP,reload
dig +short @dnsserver.ddns.com my.ddns.com

把域名的 TTL 设低一点,1 至 5 秒比较好。

caddy 反代,堪比 nginx 收费版。

你反代的不是 https://ddns.domain.com:4430 吗?干嘛又去 curl ddns.domain.com ( 80 端口),curl https://ddns.domain.com:4430 看看状态是否正常,若不正常和 nginx 无关。

如果你 ddns 后面那台电脑是你自己控制的话,直接 ssh 或者用 frp 把端口映射到服务器上更简单

正常的,因为我是手打的,端口忘了写了。我肯定会排除 ddns 的问题,不然我也不能怀疑 nginx。
比如我把 ddns 的 8443 映射到 vps 的 443 端口,那我 vps 的 443 端口挂其他东西了,所以反代比较合适。你说的 ssh 映射我不太懂,但是应该类似于端口转发吧
我用的 cloudxns,最低 60,但是我 ping 的时候发现 ip 变了,curl ddns.domain.com:8443 结果也对,所以和 ttl 应该也没关系。
我试试这个 https://www.oschina.net/translate/nginx-with-dynamic-upstreams?print

我的意思是你随便把他转发到你服务器上的一个端口,然后在服务器上用 nginx 直接对 127.0.0.1 反代就行了

哦 这样啊。 那就是 ddns 端每次 ip 变化,都连接到服务器,让服务器转发到新 ip 上。如果连接了 ssh,我觉得执行一句 nginx -s reload 也可以解决问题。

其实我的意思是你根本用不着 ddns,直接从你家的电脑连接到你的服务器,把端口反向转发到你的服务器上,然后就相当于你服务器上的一个本地端口了,再然后你想怎么配置 nginx 就简单多了

server {
...
resolver 114.114.114.114 valid=5s;
set $upstream "http://ddns.domain.com:4430";
proxy_pass $upstream;
...
}
可以尝试一下在 nignx 里指定 DNS 服务器和有效期。

再贴上文档:
https://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

楼上正解

我记得 nginx 配置文件里的域名,是重载配置的时候生效。好像要用 lua 脚本写 upstream 才能动态即时生效。

这样的情况最好就是你的 IP 变了就访问一下服务器,让服务器完成 nginx 的 reload。
很多路由器都有联网后打开某个页面的功能的。
否则就要像 15 楼那样定时轮询……

因为 Nginx 只在读取配置时解析 DNS,之后不会更新
要更新需要 reload
要跟随 DNS 需要加 resolve 选项,而这是商业版才有的。
最简单办法:定时 nginx -s reload


不正解,Nginx 不会跟随 DNS
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

但是事实上,@Terenc3 的方法解决了我的问题。他这个好像是用变量,而不是用 upsteam,或者 变量

不应该和 nginx 有关

$upstream 的作用是什么?

如果在 {} 符号里使用 set,那么每次调用该 {} 都会跑一次 set。
而$upstream 只是一个变量名称,可以修改为任何内容:
server {
...
resolver [DNS IP 地址] valid=5s;
set $[变量名]"http://ddns.domain.com:4430";
proxy_pass $[变量名];
...
}
这个用法类似传递真实 IP 到后端的变量:
set $realip $remote_addr;

resolve 选项免费版支持的。默认缓存是参考域名对应的 TTL。如果设置了 valid,则 valid 优先。

我的意思是,为什么要用 upstream 变量间接而不是直接写在下面

因为使用了 DDNS 的缘故,为了达到每次访问都检查 DNS 的缘故,所以要用 set,而 set 需要指定一个变量,所以会有一个变量。
如果直接使用 proxy_pass https://ddns.domain.com:4430,则只会在 nginx 启动时解析一次,后面需要重新解析就需要 reload。

原来可以这样

牛人,翻博客中,学习了

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服