V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kisshere
V2EX  ›  程序员

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

  •  
  •   kisshere · 2022-09-28 10:11:31 +08:00 · 2894 次点击
    这是一个创建于 789 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 ,就没这问题。
    coolloves
        14
    coolloves  
       2022-09-28 13:51:40 +08:00
    @kisshere
    upstream www.abc.com {
    server 127.0.0.1;
    keepalive 8;
    }
    lambdaq
        15
    lambdaq  
       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 ,反代成功了!
    0312birdzhang
        17
    0312birdzhang  
       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   ·   实用小工具   ·   5633 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:14 · PVG 16:14 · LAX 00:14 · JFK 03:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.