V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
ColinZeb
V2EX  ›  NGINX

nginx 如何反代 ddns 网站?

  •  
  •   ColinZeb ·
    ColinZeb · 2017-09-01 09:14:53 +08:00 · 7367 次点击
    这是一个创建于 2619 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假设我有一个 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-09-01 09:25:58 +08:00
    你确定 ddns 搞好了,重新拨号你 ddns 解析更新没有。这锅感觉和 nginx 无关系
    ColinZeb
        2
    ColinZeb  
    OP
       2017-09-01 09:29:04 +08:00
    @xiaoz 当然确定,ping ip 变了,curl home.domain.com 返回结果也正确。然后 curl ddns.domain.com 卡住
    ColinZeb
        3
    ColinZeb  
    OP
       2017-09-01 09:30:34 +08:00
    上面说反了,反正就是原始 ddns 域名好使,配置的反代域名不好使。
    ColinZeb
        4
    ColinZeb  
    OP
       2017-09-01 09:37:13 +08:00
    问个无关的问题,为什么这个主题我不能编辑了,也不能追加,是因为我又发布了一个新主题吗?有错别字不能改好别扭……
    GPU
        5
    GPU  
       2017-09-01 09:40:57 +08:00
    greenskinmonster
        6
    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
        7
    Terenc3  
       2017-09-01 09:53:18 +08:00
    把域名的 TTL 设低一点,1 至 5 秒比较好。
    terrawu
        8
    terrawu  
       2017-09-01 09:54:19 +08:00
    caddy 反代,堪比 nginx 收费版。
    xiaoz
        9
    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
        10
    wwqgtxx  
       2017-09-01 10:13:44 +08:00 via iPhone
    如果你 ddns 后面那台电脑是你自己控制的话,直接 ssh 或者用 frp 把端口映射到服务器上更简单
    ColinZeb
        11
    ColinZeb  
    OP
       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
        12
    wwqgtxx  
       2017-09-01 10:27:33 +08:00 via iPhone
    @ColinZeb 我的意思是你随便把他转发到你服务器上的一个端口,然后在服务器上用 nginx 直接对 127.0.0.1 反代就行了
    ColinZeb
        13
    ColinZeb  
    OP
       2017-09-01 10:37:18 +08:00
    @wwqgtxx 哦 这样啊。 那就是 ddns 端每次 ip 变化,都连接到服务器,让服务器转发到新 ip 上。如果连接了 ssh,我觉得执行一句 nginx -s reload 也可以解决问题。
    wwqgtxx
        14
    wwqgtxx  
       2017-09-01 10:41:32 +08:00 via iPhone   ❤️ 1
    @ColinZeb 其实我的意思是你根本用不着 ddns,直接从你家的电脑连接到你的服务器,把端口反向转发到你的服务器上,然后就相当于你服务器上的一个本地端口了,再然后你想怎么配置 nginx 就简单多了
    Terenc3
        15
    Terenc3  
       2017-09-01 11:36:57 +08:00   ❤️ 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-09-01 11:37:50 +08:00
    lanwairen123
        17
    lanwairen123  
       2017-09-01 13:34:29 +08:00 via Android
    楼上正解
    littlehz
        18
    littlehz  
       2017-09-01 15:28:54 +08:00
    我记得 nginx 配置文件里的域名,是重载配置的时候生效。好像要用 lua 脚本写 upstream 才能动态即时生效。
    lyhiving
        19
    lyhiving  
       2017-09-01 15:54:25 +08:00
    这样的情况最好就是你的 IP 变了就访问一下服务器,让服务器完成 nginx 的 reload。
    很多路由器都有联网后打开某个页面的功能的。
    否则就要像 15 楼那样定时轮询……
    ryd994
        20
    ryd994  
       2017-09-01 17:55:00 +08:00 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-09-01 21:33:38 +08:00
    @ryd994 但是事实上,@Terenc3 的方法解决了我的问题。他这个好像是用变量,而不是用 upsteam,或者 @proxy 变量
    Tink
        22
    Tink  
       2017-09-01 21:49:15 +08:00 via iPhone
    不应该和 nginx 有关
    ryd994
        23
    ryd994  
       2017-09-01 23:13:25 +08:00 via Android
    @Terenc3 $upstream 的作用是什么?
    Terenc3
        24
    Terenc3  
       2017-09-01 23:27:35 +08:00
    @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-09-02 00:27:31 +08:00 via Android
    resolve 选项免费版支持的。默认缓存是参考域名对应的 TTL。如果设置了 valid,则 valid 优先。
    ryd994
        26
    ryd994  
       2017-09-02 02:27:05 +08:00 via Android
    @Terenc3 我的意思是,为什么要用 upstream 变量间接而不是直接写在下面
    Terenc3
        27
    Terenc3  
       2017-09-02 11:28:59 +08:00   ❤️ 1
    @ryd994 因为使用了 DDNS 的缘故,为了达到每次访问都检查 DNS 的缘故,所以要用 set,而 set 需要指定一个变量,所以会有一个变量。

    如果直接使用 proxy_pass https://ddns.domain.com:4430,则只会在 nginx 启动时解析一次,后面需要重新解析就需要 reload。
    ryd994
        28
    ryd994  
       2017-09-02 11:31:02 +08:00 via Android
    @Terenc3 原来可以这样
    ahu
        29
    ahu  
       2017-09-03 11:17:51 +08:00
    @Terenc3 牛人,翻博客中,学习了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2516 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 10:22 · PVG 18:22 · LAX 03:22 · JFK 06:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.