nginx 如何反代 ddns 网站? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ColinZeb
V2EX    NGINX

nginx 如何反代 ddns 网站?

  •  
  •   ColinZeb
    ColinZeb 2017 年 9 月 1 日 8046 次点击
    这是一个创建于 3074 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假设我有一个 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 缓存。求问如何解决。
    29 条回复    2017-09-03 11:17:51 +08:00
    xiaoz
        1
    xiaoz  
       2017 年 9 月 1 日
    你确定 ddns 搞好了,重新拨号你 ddns 解析更新没有。这锅感觉和 nginx 无关系
    ColinZeb
        2
    ColinZeb  
    OP
       2017 年 9 月 1 日
    @xiaoz 当然确定,ping ip 变了,curl home.domain.com 返回结果也正确。然后 curl ddns.domain.com 卡住
    ColinZeb
        3
    ColinZeb  
    OP
       2017 年 9 月 1 日
    上面说反了,反正就是原始 ddns 域名好使,配置的反代域名不好使。
    ColinZeb
        4
    ColinZeb  
    OP
       2017 年 9 月 1 日
    问个无关的问题,为什么这个主题我不能编辑了,也不能追加,是因为我又发布了一个新主题吗?有错别字不能改好别扭……
    GPU
        5
    GPU  
       2017 年 9 月 1 日
    greenskinmonster
        6
    greenskinmonster  
       2017 年 9 月 1 日
    nginx 没有自己的 dns 缓存,我也是反代 ddns 的域名,没有问题。

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

    dig +short @dnsserver.ddns.com my.ddns.com
    Terenc3
        7
    Terenc3  
       2017 年 9 月 1 日
    把域名的 TTL 设低一点,1 至 5 秒比较好。
    terrawu
        8
    terrawu  
       2017 年 9 月 1 日
    caddy 反代,堪比 nginx 收费版。
    xiaoz
        9
    xiaoz  
       2017 年 9 月 1 日
    @ColinZeb 你反代的不是 https://ddns.domain.com:4430 吗?干嘛又去 curl ddns.domain.com ( 80 端口),curl https://ddns.domain.com:4430 看看状态是否正常,若不正常和 nginx 无关。
    wwqgtxx
        10
    wwqgtxx  
       2017 年 9 月 1 日 via iPhone
    如果你 ddns 后面那台电脑是你自己控制的话,直接 ssh 或者用 frp 把端口映射到服务器上更简单
    ColinZeb
        11
    ColinZeb  
    OP
       2017 年 9 月 1 日
    @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
        12
    wwqgtxx  
       2017 年 9 月 1 日 via iPhone
    @ColinZeb 我的意思是你随便把他转发到你服务器上的一个端口,然后在服务器上用 nginx 直接对 127.0.0.1 反代就行了
    ColinZeb
        13
    ColinZeb  
    OP
       2017 年 9 月 1 日
    @wwqgtxx 哦 这样啊。 那就是 ddns 端每次 ip 变化,都连接到服务器,让服务器转发到新 ip 上。如果连接了 ssh,我觉得执行一句 nginx -s reload 也可以解决问题。
    wwqgtxx
        14
    wwqgtxx  
       2017 年 9 月 1 日 via iPhone   1
    @ColinZeb 其实我的意思是你根本用不着 ddns,直接从你家的电脑连接到你的服务器,把端口反向转发到你的服务器上,然后就相当于你服务器上的一个本地端口了,再然后你想怎么配置 nginx 就简单多了
    Terenc3
        15
    Terenc3  
       2017 年 9 月 1 日   4
    server {
    ...
    resolver 114.114.114.114 valid=5s;
    set $upstream "http://ddns.domain.com:4430";
    proxy_pass $upstream;
    ...
    }

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

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

    @lanwairen123
    @Terenc3
    不正解,Nginx 不会跟随 DNS
    http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
    ColinZeb
        21
    ColinZeb  
    OP
       2017 年 9 月 1 日
    @ryd994 但是事实上,@Terenc3 的方法解决了我的问题。他这个好像是用变量,而不是用 upsteam,或者 @proxy 变量
    Tink
        22
    Tink  
    PRO
       2017 年 9 月 1 日 via iPhone
    不应该和 nginx 有关
    ryd994
        23
    ryd994  
       2017 年 9 月 1 日 via Android
    @Terenc3 $upstream 的作用是什么?
    Terenc3
        24
    Terenc3  
       2017 年 9 月 1 日
    @ryd994 如果在 {} 符号里使用 set,那么每次调用该 {} 都会跑一次 set。

    而$upstream 只是一个变量名称,可以修改为任何内容:

    server {
    ...
    resolver [DNS IP 地址] valid=5s;
    set $[变量名]"http://ddns.domain.com:4430";
    proxy_pass $[变量名];
    ...
    }

    这个用法类似传递真实 IP 到后端的变量:
    set $realip $remote_addr;
    sylecn
        25
    sylecn  
       2017 年 9 月 2 日 via Android
    resolve 选项免费版支持的。默认缓存是参考域名对应的 TTL。如果设置了 valid,则 valid 优先。
    ryd994
        26
    ryd994  
       2017 年 9 月 2 日 via Android
    @Terenc3 我的意思是,为什么要用 upstream 变量间接而不是直接写在下面
    Terenc3
        27
    Terenc3  
       2017 年 9 月 2 日   1
    @ryd994 因为使用了 DDNS 的缘故,为了达到每次访问都检查 DNS 的缘故,所以要用 set,而 set 需要指定一个变量,所以会有一个变量。

    如果直接使用 proxy_pass https://ddns.domain.com:4430,则只会在 nginx 启动时解析一次,后面需要重新解析就需要 reload。
    ryd994
        28
    ryd994  
       2017 年 9 月 2 日 via Android
    @Terenc3 原来可以这样
    ahu
        29
    ahu  
       2017 年 9 月 3 日
    @Terenc3 牛人,翻博客中,学习了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2345 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 09:26 PVG 17:26 LAX 01:26 JFK 04:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86