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

容器中的 nginx 正确反代其它容器的姿势是什么?

  •  
  •   nyxsonsleep · 27 天前 · 1529 次点击

    nginx 在 N 容器上,N 容器位于 docker networks 中的 Nnet 网络上。

    A 是一个服务,同样位于 Nnet 网络内,开放了 10086 端口,该服务默认情况下未独立配置 https 。

    1. 如果 nginx 想要反代 A ,应该指向哪个 ip ?如果两个容器不在同一个 docker networks 中有区别吗?
    2. 是不是只需要配置 nginx 的 tls ,加上反代就能保证访问反代到的 https 的 A 服务。
    17 条回复    2024-10-24 10:20:36 +08:00
    imdong
        1
    imdong  
       27 天前 via iPhone   ❤️ 1
    不使用 IP ,直接指向容器名。
    yinmin
        2
    yinmin  
       27 天前 via iPhone
    最稳定和安全的方式:N 容器和 A 容器都设置固定 ip 地址( Nnet 网络下的),nginx 指向 A 容器的固定 ip 。不用将 A 的 tcp 端口-p 映射出来。

    nginx 上部署 https 即可,A 容器直接 http 没必须 https 。
    yinmin
        3
    yinmin  
       27 天前 via iPhone
    我不喜欢在 nginx 里配置容器名,因为有些极端情况下,会发生容器名解析 ip 错误导致 nginx 不正常。在容器启动参数里加固定 ip 最为稳定。
    oneisall8955
        4
    oneisall8955  
       27 天前

    指定容器名称,127.0.0.11 是 docker 的 dns ip
    esee
        5
    esee  
       27 天前
    nginx 反代 宿主机的 IP 不行么?
    daniel8642
        6
    daniel8642  
       27 天前
    都用 docker 了,要不试试 traefik 。
    单机部署的话,用 docker compose 配置容器,
    反代配置直接写在 docker compose 的 Label 配置里面。

    我之前是在主机上装的 nginx ,就是担心容器内网络转发配置太复杂混乱了。
    最近服务器快到期,准备重新倒腾一下。
    cookii
        7
    cookii  
       27 天前 via Android
    nginx 用 host 模式,直接指向暴露出来的 localhost:端口
    nyxsonsleep
        8
    nyxsonsleep  
    OP
       27 天前
    @esee #5 原因有 2 点:
    1. 我用了 NginxProxyManager ,反代宿主机 IP 结果只有配置 http 的情况下可以访问,否则 502 ,不知为什么。
    2. 宿主机 ip 应该只会放开 80 和 443 端口,其它端口不打算继续放开,目前仅测试功能。(实际情况有点复杂,但可以这么理解。
    nyxsonsleep
        9
    nyxsonsleep  
    OP
       27 天前
    @cookii #7 网安不允许。容器镜像是特制的,有检测工具。
    povsister
        10
    povsister  
       27 天前 via iPhone
    听说过 Ingres controller 吗
    nyxsonsleep
        11
    nyxsonsleep  
    OP
       27 天前
    @imdong #1 我能在容器中访问到对应的同 docker net 网络中其它容器的端口,但是在 nginx 和 caddy 中无法反代访问到。
    esee
        12
    esee  
       27 天前
    @nyxsonsleep 宿主机的 IP ,不是公网 IP ,宿主机的 IP 对外开放几个端口,都不影响你反代到宿主机的端口啊。都还没到防火墙呢。
    dusu
        13
    dusu  
       27 天前 via iPhone
    宿主机配个回环地址 例如 10.0.0.1
    SenLief
        14
    SenLief  
       27 天前
    bridge 模式,把所有的容器都添加到同一个网络中,npm 也要添加进去,然后用 容器名:端口 连接
    evada
        15
    evada  
       27 天前
    nginx 和 A 服务在一个 docker 网络不是可以直接访问容器名吗?
    server {
    listen 443 ssl;
    listen [::]:443;
    server_name 127.0.0.1;

    # security
    include nginxconfig.io/security.conf;
    # 指定 ssl 证书路径
    ssl_certificate xxx.com.cn_server.crt;
    # 指定私钥文件路径
    ssl_certificate_key xxx.com.cn_server.key;

    # logging
    access_log /var/log/nginx/access.log combined buffer=512k flush=1m;
    error_log /var/log/nginx/error.log warn;

    # reverse proxy
    location / {
    proxy_pass http://A:10086;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_redirect off;
    include nginxconfig.io/proxy.conf;
    }
    }
    jpyl0423
        16
    jpyl0423  
       26 天前
    nginx 容器和目标容器在同一个 docker network 上就行,nginx 直接指向目前容器名字
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3617 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:49 · PVG 08:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.