V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nianlifeixing
V2EX  ›  问与答

一个域名、通过 nginx 有可能完全代理多个 docker 服务么

  •  
  •   nianlifeixing · 32 天前 via iPhone · 1463 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:
    现在有一个域名: https://a.cn ,我在公网服务器启动了 docker 、可能有三四个服务、

    想法:
    我的想法是通过域名+url 、比如 a.cn/app1 、来取代 ip+端口的形式、比如 11.11.32.233:8000 、

    实际问题:
    可能有很多 url 、完全 url 代理不完、比如 static 、其实用的是 docker 容器中的目录

    场景展现:
    用 nginx 代理后 location app1/{ 11.11.32.232:8000/}、这种方式定义后、并不怎么好用、因为会先返回 html 、html 中包含 static 路径、比如/static/res.img , 但因为我实际代理了、所以应该是/app1/static/res.img 、 这种情况有很多、难道要一个个进行代理么、然后回写替代 url ,

    疑惑:
    这种情况下有什么简单方式可以直接用 url 轻松代理 ip+端口么、大家都没遇到过么
    15 条回复    2024-08-18 12:50:44 +08:00
    PolarBears
        1
    PolarBears  
       32 天前   ❤️ 1
    使用二级域名就没有这个问题了
    jackOff
        2
    jackOff  
       32 天前   ❤️ 1
    楼上正解,以前用宝塔搭服务就是这样子玩的,主要工作就是把一些灰产项目隐藏在正常的业务路由里
    chenluo0429
        3
    chenluo0429  
       32 天前 via Android
    实际上需要部署的服务本身支持才行,资源文件使用相对目录,支持设置 BASE_URL 等等。
    rewite 目录确实能做到转写,但是一旦两个服务存在相同的目录资源,你是没办法分清该代理给谁的
    facebook47
        4
    facebook47  
       32 天前 via Android
    理论可以,只要你的 URL 有规律可循
    sagaxu
        5
    sagaxu  
       31 天前   ❤️ 1
    通过 path 来区分多个服务,需要你的服务自身支持,例如在配置文件中指定 path ,或者使用相对路径引用资源文件。在服务的配置文件中写入 path ,意味着部署方式影响到了服务自身,也算是某种程度上的耦合。

    更好的方式是通过二级域名来区分,服务自身根据 host 拿到自身域名。
    DIO
        6
    DIO  
       31 天前 via Android
    Nginx Proxy Manager ,傻瓜式操作,你值得拥有
    yingxiangyu
        7
    yingxiangyu  
       31 天前   ❤️ 1
    二级域名+反向代理
    oldcai
        8
    oldcai  
       31 天前   ❤️ 1
    https://nginx.org/en/docs/http/ngx_http_sub_module.html#sub_filter


    location /app1/ {
    proxy_pass http://11.11.32.233:8000/;
    sub_filter '/static/' '/app1/static/';
    sub_filter_once off;
    }
    xiaowoniukai
        9
    xiaowoniukai  
       31 天前
    搞个泛解析,这样一个服务一个名字😁
    brainzhang
        10
    brainzhang  
       31 天前   ❤️ 1
    可以的,最简单的办法就是用二级域名,每个 docker 服务用不同端口,然后一个域名对应一个 docker 服务;用 Nginx 的反向代理来控制;

    比如
    A1.xx.com ,对应 8001 端口 服务;
    A2.xx.com ,对应 8002 端口服务;

    每一个服务最好都封装到 docker 服务里面,像 static 目录静态 web 服务这种,最好也不要用 nginx 来做了,也封装到 docker 服务里面,就是做到一个 docker 容器启动,就能从本地 http://127.0.0.1:800x 端口直接访问,这样最干净;

    我原来有一篇文章记录了自己的操作,可以参考一下:

    [Nginx 配置多端口多域名访问 -- 子域名多端口访问]

    https://brain-zhang.github.io/blog/2019/11/18/nginxpei-zhi-duo-duan-kou-duo-yu-ming-fang-wen/
    povsister
        11
    povsister  
       31 天前 via iPhone
    rewrite 了解一下
    nianlifeixing
        12
    nianlifeixing  
    OP
       31 天前 via iPhone
    @PolarBears 感谢、确实二级域名是最简单省事的
    nianlifeixing
        13
    nianlifeixing  
    OP
       31 天前 via iPhone
    @jackOff
    @chenluo0429 确实~ 还是二级域名吧、解析太麻烦了😡
    nianlifeixing
        14
    nianlifeixing  
    OP
       31 天前 via iPhone
    @sagaxu 是的、docker 服务基本不可控,我还是老老实实二级域名吧
    nianlifeixing
        15
    nianlifeixing  
    OP
       31 天前 via iPhone
    @brainzhang 是的、还是二级域名方便 哈哈😆
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5751 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:02 · PVG 10:02 · LAX 19:02 · JFK 22:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.