nginx 反代 upstream 不支持域名只能支持 ip? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
kisshere
V2EX    程序员

nginx 反代 upstream 不支持域名只能支持 ip?

  •  
  •   kisshere 2022-09-28 10:11:31 +08:00 3427 次点击
    这是一个创建于 1183 天前的主题,其中的信息可能已经有所发展或是发生改变。
    upstream backend { server 127.0.0.1; keepalive 8; } server { listen 80; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ""; } } 

    如果把 www.abc.com 在 hosts 文件中解析为 127.0.0.1 ,然后

    upstream backend { server www.abc.com; keepalive 8; } 

    nginx 反代就失败了,nginx 这么低级?

    24 条回复    2022-09-30 14:57:30 +08:00
    vopsoft
        1
    vopsoft  
       2022-09-28 10:14:46 +08:00
    不用 upstream 直接 proxy_pass http://www.abc.com;就行哈
    kisshere
        2
    kisshere  
    OP
       2022-09-28 10:28:48 +08:00
    @vopsoft 我想过这样,但这样就不支持 keepalive 了
    eason1874
        3
    eason1874  
       2022-09-28 10:36:28 +08:00
    nginx 解析有缓存的,可能是你启动 nginx 后才改的 hosts 缓存没更新?重启 nginx 试试

    在日志里加 $upstream_addr 这个变量可以记录具体的反代 IP 地址
    julyclyde
        4
    julyclyde  
       2022-09-28 11:14:25 +08:00
    需要设置 resolver
    quanjw
        5
    quanjw  
       2022-09-28 11:20:28 +08:00
    支持的,但是我家宽的 IP 经常变,会失效,需要重启 nginx 才行。个人经验
    chengjiezhou1024
        6
    chengjiezhou1024  
       2022-09-28 11:29:15 +08:00   2
    首先, nginx 不会读取 /etc/hosts 进行 dns 解析, 仅会使用 resolver 指定的 dns server 进行域名解析.
    第二, 对于直接使用域名的方式: ‘proxy_pass http://www.abc.com;’ 只会在启动时执行一次 dns 解析, 后面不再进行解析.

    对于第二个问题, 可以使用变量的方式解决:
    set $backend www.abc.com;
    proxy_pass http://$backend;
    anyinuo0413
        7
    anyinuo0413  
       2022-09-28 11:31:15 +08:00
    @chengjiezhou1024 问一下 您这里使用变量的方式解决 相当于 会自动更新域名 DDNS   IP 嘛
    PMR
        8
    PMR  
       2022-09-28 11:35:55 +08:00 via Android
    @quanjw
    @anyinuo0413
    nginx.org 都是启动时做 dns 解析 后续不会在重新解析

    nginx plus 就有定时解析功能
    chengjiezhou1024
        9
    chengjiezhou1024  
       2022-09-28 11:49:36 +08:00
    chengjiezhou1024
        10
    chengjiezhou1024  
       2022-09-28 11:53:19 +08:00
    @anyinuo0413
    对的, 你可以测试下, 抓 dns 解析请求看下.
    anyinuo0413
        11
    anyinuo0413  
       2022-09-28 12:09:35 +08:00
    @chengjiezhou1024 好的,感谢 晚上回家试一下 我现在写了个脚本每分钟检测一次 ddns 是否更新 如果更新了就 reload 一下 ng
    julyclyde
        12
    julyclyde  
       2022-09-28 12:57:14 +08:00
    @anyinuo0413 其实你现在这个做法可能更好
    毕竟家庭接入 IP 变化率比集群里边 pod 变化率低太多了
    starrys
        13
    starrys  
       2022-09-28 13:10:24 +08:00 via Android
    @quanjw
    @anyinuo0413
    个人或家庭使用可以考虑换成 caddy ,就没这问题。
    sparkssssssss
        14
    sparkssssssss  
       2022-09-28 13:51:40 +08:00
    @kisshere
    upstream www.abc.com {
    server 127.0.0.1;
    keepalive 8;
    }
    tf2
        15
    tf2  
       2022-09-28 14:03:29 +08:00
    @chengjiezhou1024 相当准确。
    kisshere
        16
    kisshere  
    OP
       2022-09-28 15:48:16 +08:00
    @chengjiezhou1024

    "nginx 不会读取 /etc/hosts 进行 dns 解析",你没做过试验就确定这句话???我在前端服务器 /etc/hosts 文件里乱打了一个网址 1.2.3.4 www.asdfasdffasdf.com 。 然后在 upstream 服务器( 1.2.3.4 )的一个网站新增绑定了这个域名 www.asdfasdffasdf.com ,反代成功了!
    1daydayde
        17
    1daydayde  
       2022-09-28 18:11:06 +08:00
    nginx 的 http 部分有个 resolver ip; 的参数
    julyclyde
        18
    julyclyde  
       2022-09-29 08:44:21 +08:00
    @kisshere 你刚开始提问的时候说这种设置会失败啊?
    kisshere
        19
    kisshere  
    OP
       2022-09-29 09:49:53 +08:00
    @julyclyde 我是直接 proxy_pass http://www.asdfasdffasdf.com; 不是像帖子中那样把 upstream 单独放在一边
    julyclyde
        20
    julyclyde  
       2022-09-29 10:30:49 +08:00
    @kisshere 直接 proxy_pass 到域名,和到 upstream 、upstream 里包含域名,是两种不同的情况
    ntuwang
        21
    ntuwang  
       2022-09-29 13:43:28 +08:00
    用 jdomain 啊,可以支持域名
    chengjiezhou1024
        22
    chengjiezhou1024  
       2022-09-29 14:16:38 +08:00
    @kisshere
    你可以尝试一下, nginx 启动后修改 hosts 文件更改域名对应的地址, 改动是否会生效.
    你可以测试下如果一个域名对应多个 IP 地址, 能不能将流量转发到每个 IP 地址上.


    set $backend www.abc.com;
    proxy_pass http://$backend;

    这种方式能解决上面两个问题.
    kisshere
        23
    kisshere  
    OP
       2022-09-29 20:38:27 +08:00
    @chengjiezhou1024 但至少"nginx 不会读取 /etc/hosts 进行 dns 解析"这句话错误了吧
    chengjiezhou1024
        24
    chengjiezhou1024  
       2022-09-30 14:57:30 +08:00
    @kisshere
    应该修改为“运行阶段不会读取 /etc/hosts 进行 dns 解析”
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     944 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 20:54 PVG 04:54 LAX 12:54 JFK 15:54
    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