nginx 如何反代 ddns 网站?

2017-09-01 09:14:53 +08:00
 ColinZeb
假设我有一个 ddns 域名 ddns.domain.com ,但是由于运营商原因屏蔽了 443 和 80 端口,所以只能用端口 4430,
但是输入域名还要输入端口好麻烦,所以像配置个反代,home.domain.com
我 nginx 配置写的是 proxy_pass https://ddns.domain.com:4430

确实好使,但是问题来了,路由器重新拨号的时候 ddns.domain.com 的 ip 变了,反代域名 ddns.domain.com 就挂了,出现 504 网关错误。
怀疑是 nginx 有 dns 缓存。求问如何解决。
7436 次点击
所在节点    NGINX
29 条回复
xiaoz
2017-09-01 09:25:58 +08:00
你确定 ddns 搞好了,重新拨号你 ddns 解析更新没有。这锅感觉和 nginx 无关系
ColinZeb
2017-09-01 09:29:04 +08:00
@xiaoz 当然确定,ping ip 变了,curl home.domain.com 返回结果也正确。然后 curl ddns.domain.com 卡住
ColinZeb
2017-09-01 09:30:34 +08:00
上面说反了,反正就是原始 ddns 域名好使,配置的反代域名不好使。
ColinZeb
2017-09-01 09:37:13 +08:00
问个无关的问题,为什么这个主题我不能编辑了,也不能追加,是因为我又发布了一个新主题吗?有错别字不能改好别扭……
GPU
2017-09-01 09:40:57 +08:00
greenskinmonster
2017-09-01 09:49:58 +08:00
nginx 没有自己的 dns 缓存,我也是反代 ddns 的域名,没有问题。

实在不行,直接去你 ddns 的域名解析服务器查最新的 IP,然后替换配置文件中的 IP,reload

dig +short @dnsserver.ddns.com my.ddns.com
Terenc3
2017-09-01 09:53:18 +08:00
把域名的 TTL 设低一点,1 至 5 秒比较好。
terrawu
2017-09-01 09:54:19 +08:00
caddy 反代,堪比 nginx 收费版。
xiaoz
2017-09-01 10:07:27 +08:00
@ColinZeb 你反代的不是 https://ddns.domain.com:4430 吗?干嘛又去 curl ddns.domain.com ( 80 端口),curl https://ddns.domain.com:4430 看看状态是否正常,若不正常和 nginx 无关。
wwqgtxx
2017-09-01 10:13:44 +08:00
如果你 ddns 后面那台电脑是你自己控制的话,直接 ssh 或者用 frp 把端口映射到服务器上更简单
ColinZeb
2017-09-01 10:22:01 +08:00
@xiaoz 正常的,因为我是手打的,端口忘了写了。我肯定会排除 ddns 的问题,不然我也不能怀疑 nginx。

@wwqgtxx 比如我把 ddns 的 8443 映射到 vps 的 443 端口,那我 vps 的 443 端口挂其他东西了,所以反代比较合适。你说的 ssh 映射我不太懂,但是应该类似于端口转发吧
@Terenc3 我用的 cloudxns,最低 60,但是我 ping 的时候发现 ip 变了,curl ddns.domain.com:8443 结果也对,所以和 ttl 应该也没关系。
@GPU 我试试这个 https://www.oschina.net/translate/nginx-with-dynamic-upstreams?print
wwqgtxx
2017-09-01 10:27:33 +08:00
@ColinZeb 我的意思是你随便把他转发到你服务器上的一个端口,然后在服务器上用 nginx 直接对 127.0.0.1 反代就行了
ColinZeb
2017-09-01 10:37:18 +08:00
@wwqgtxx 哦 这样啊。 那就是 ddns 端每次 ip 变化,都连接到服务器,让服务器转发到新 ip 上。如果连接了 ssh,我觉得执行一句 nginx -s reload 也可以解决问题。
wwqgtxx
2017-09-01 10:41:32 +08:00
@ColinZeb 其实我的意思是你根本用不着 ddns,直接从你家的电脑连接到你的服务器,把端口反向转发到你的服务器上,然后就相当于你服务器上的一个本地端口了,再然后你想怎么配置 nginx 就简单多了
Terenc3
2017-09-01 11:36:57 +08:00
server {
...
resolver 114.114.114.114 valid=5s;
set $upstream "http://ddns.domain.com:4430";
proxy_pass $upstream;
...
}

可以尝试一下在 nignx 里指定 DNS 服务器和有效期。
Terenc3
2017-09-01 11:37:50 +08:00
lanwairen123
2017-09-01 13:34:29 +08:00
楼上正解
littlehz
2017-09-01 15:28:54 +08:00
我记得 nginx 配置文件里的域名,是重载配置的时候生效。好像要用 lua 脚本写 upstream 才能动态即时生效。
lyhiving
2017-09-01 15:54:25 +08:00
这样的情况最好就是你的 IP 变了就访问一下服务器,让服务器完成 nginx 的 reload。
很多路由器都有联网后打开某个页面的功能的。
否则就要像 15 楼那样定时轮询……
ryd994
2017-09-01 17:55:00 +08:00
因为 Nginx 只在读取配置时解析 DNS,之后不会更新
要更新需要 reload
要跟随 DNS 需要加 resolve 选项,而这是商业版才有的。

最简单办法:定时 nginx -s reload

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/387350

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX