V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
sworld233
V2EX  ›  NAS

关于 NAS 上使用 NGINX 反向代理的一些问题

  •  
  •   sworld233 · 342 天前 · 3728 次点击
    这是一个创建于 342 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到了帖子 https://www.v2ex.com/t/991802 之后,我也想将自己的 nas 只暴露一个端口,但是根据贴内的信息我怎么也完成不了,希望大家能赐教

    我的 NAS 上有多个服务,这里例举 memos 和 gitea ,装了 nginx 和 ddns-go ,将自己的域名指向了本机的 IPV6 地址 我最初的设想是这样的

    我的域名:5000/memos  --> localhost:30001(Memos 暴露的端口)
    我的域名:5000/gitea  --> localhost:30002(Gitea 暴露的端口)
    

    我的 nginx 配置大概是这样

    server {
        listen [::]:5000 ipv6only=on;
        server_name memos.sworld.club;
        location /memos/ {
            proxy_pass http://localhost:30001/;
        }
    }
    

    我发现这个 memos 应用内部会访问/asserts 这些接口,而不是/memos/asserts ,这样我就无法正确反向代理它们了,我看到有人说应该使用 sub_filter ,但是我并没有成功

    后来我换了一个办法,我想要使用多个子域名映射到同一端口,设想是这样的

    memos.我的域名:5000  --> localhost:30001(Memos 暴露的端口)
    gitea.我的域名:5000  --> localhost:30002(Gitea 暴露的端口)
    

    nginx 配置大概是这样

    server {
        listen [::]:5000 ipv6only=on;
        server_name memos.sworld.club;
        location / {
            proxy_pass http://localhost:30001;
        }
    }
    server {
        listen [::]:5000 ipv6only=on;
        server_name gitea.sworld.club;
        location / {
            proxy_pass http://localhost:30002;
        }
    }
    

    但是这样 nginx 会报端口冲突,也还是不行。 我今天折腾这个问题好几个小时,但是仍然没有结果,通过域名访问 NAS 的服务有没有一些最佳实践?恳请大家说说自己的看法

    第 1 条附言  ·  342 天前
    问题已经解决了,感谢大家的回复,这里最后贴一下我的最终方案
    我在 Docker 内部署了 NPM 服务,代理机器的 10000 端口( 10000:443 ),同时使用 DDNS-Go 将所有服务的子域名映射到我的 IPv6 地址上,路由器打开了 WAN ->LAN 10000 端口的防火墙。
    由于家用宽带没有 80 端口,我使用 DNS Chanllange 的方法让 NPM 给我搞到了证书,所有域名强制 https ,最后达到了这样的访问效果:

    https://memos.XXX.XXX:10000/ -> NAS:30001(Memos)
    https://home.XXX.XXX:10000/ -> NAS:30002(主页)

    这样只暴露了一个端口,且用上了 https ,一些页面我额外添加了 nginx 的 basic auth
    25 条回复    2024-02-01 15:07:17 +08:00
    Hconk
        1
    Hconk  
       342 天前 via iPhone   ❤️ 1
    我是用 nginx proxy manager 来管理,内网 nas 装了很多服务,通过 frp 穿透到有公网 ip 服务器上,然后 NPM 上配置多个二级域名通过内网 ip 访问本机 frp 映射过来的不同端口,只需要对外暴露 80 端口就可以,用 NPM 还有一个好处就是很方便加认证和 https ,基本不用手写配置。我这么用 memos 没遇到什么问题。不过你好像是家宽,没有 80 端口,不确是不是能这么做,可以试试。
    xinmans
        2
    xinmans  
       342 天前 via iPhone
    npm 足够了,我在 n1 盒子上装了 npm ,还支持 ssl 证书签发,爽的一笔,和 AIO 解耦
    ysc3839
        3
    ysc3839  
       342 天前 via Android
    建议分域名
    ysc3839
        4
    ysc3839  
       342 天前 via Android   ❤️ 1
    按理说不会端口冲突,请发出完整配置文件和错误日志
    yin1999
        5
    yin1999  
       342 天前 via Android
    最后一版的配置,尝试移除第二个 server 块中的 ipv6only=on 。对于 webdav 应该只能用 sni 来分流了
    sworld233
        6
    sworld233  
    OP
       342 天前
    @ysc3839
    @yin1999
    经过测试,确实是 ipv6only=on 导致端口冲突,只要去掉就不会冲突了,感谢!
    sworld233
        7
    sworld233  
    OP
       342 天前
    @xinmans
    @Hconk
    我刚才试了一下,这个是否就是提供了方便的 nginx 的 web 操作界面?我在按照 yin1999 的说法改动后 qbit 、gitea 都能正常访问使用了,除了 memos 返回 502 。我确实没有 80 接口,也因此 NPM 貌似不能自动配置 https ,不过我找到了 certbot 的手动操作方法,文档中也指出可以用一个脚本实现自动认证
    benjaminliangcom
        8
    benjaminliangcom  
       342 天前
    我用 traefik ,可以配置 mTls ,只有安装了客户端证书的才能连接
    LeeReamond
        9
    LeeReamond  
       342 天前
    老哥是公网暴露 nas 的 ipv6 然后解析直连吗,还是有中转的模式
    Wovvvv
        10
    Wovvvv  
       342 天前
    兄弟,第一次玩这个不是很明白,我的方案是使用家宽,跟你一样使用的 ipv6 公网 ip ,端口没有 443 有 80 ,这样可不可以使用 https 加密吗?
    lm930129
        11
    lm930129  
       342 天前
    @Wovvvv 443 和 https 没有必然关系,你用其他端口一样可以 https
    wyxls
        12
    wyxls  
       342 天前
    在 docker 容器里,涉及 web 服务有很大概率会在内部内置一个反代的 web server ,通常会默认做好服务监听和服务端口的转发,比如 elasticsearch 之类的容器镜像。

    反代没有很复杂的点,无非就是正确地将请求转发给容器内部并确保容器能正确返回结果给客户端,但由于上述的一层反代会让情况变麻烦

    如果想节省功夫开箱即用,最好是用二级域名区分服务,这样就不用研究容器内部是怎么处理网络请求的,缺点是需要记忆维护域名
    如果想要用子路径反代容器服务,就得先了解熟悉容器内部的反代逻辑,然后正确配置 NGINX 的反代路径,在涉及到端口转发时会变得尤为麻烦,因为你还要研究容器内部是如何处理请求的。优点当然是域名通用,缺点也很明显,配置麻烦

    ipv6only 官方文档说是一次性配置 This parameter is turned on by default. It can only be set once on start.
    https://nginx.org/en/docs/http/ngx_http_core_module.html

    最后说一下 NPM ,这个的确提供了一个比较方便的 webui ,内置 certbot 而且能设置成 dns challenge 轻松获得免费的通配域名证书,方便上 SSL 和自动更新,应对一般反代需求十分够用。
    但配置上不够灵活,更新修复也不够及时(隔了快 5 个月才修复 certbot 依赖缺失问题);它只提供了固定的一些反代配置,有些自定义内容会与模板冲突,想添加 stream 也只能在指定路径添加内容(data/custom/stream.conf)
    Xingchen366
        13
    Xingchen366  
       342 天前 via Android
    上二级域名方便一点 推荐使用 lucky 替换 nginx 配置更简单
    wyxls
        14
    wyxls  
       342 天前
    @Xingchen366 lucky 的 webui 比起 npm 配置反代更加“死板”,勉强够用
    sworld233
        15
    sworld233  
    OP
       342 天前
    @LeeReamond 是解析直连的

    @wyxls 讲解的很详细,感谢,这样看直接用二级域名是个更为方便的选择。开启为 dns challenge 我之前没注意到,这个确实对我来说够用了
    wyxls
        16
    wyxls  
       342 天前   ❤️ 1
    @sworld233 更正一下,刚才 pull 了 npm 的 v2.11.1 ,certbot 缺少 zope 的问题依然没解决,要用的话记得在里边安装一下 zope

    去年 5 月份官方就有 PR 简单修复,但是一直没 merge
    [官方 PR#2756]( https://github.com/NginxProxyManager/nginx-proxy-manager/pull/2756)
    genicsoft123
        17
    genicsoft123  
       342 天前
    装个面板吧,方便很多,另外搭配 frp 用,外网穿透更方便,或者结合 tailscale 用
    sworld233
        18
    sworld233  
    OP
       342 天前
    @genicsoft123 我现在是装了 NPM ,域名指向 v6 地址,然后又接入了 zeroter
    xinmans
        19
    xinmans  
       342 天前 via iPhone
    @sworld233 memos 我用 npm 实现了 https 访问,主要是增加证书
    libook
        20
    libook  
       342 天前 via Android
    需要应用本身支持自定义子路径,比如假设 memos 配置项里支持设置自定义子路径,那么你可以设置子路径为/memos ,这样 memos 就是去/mrmos/asserts 找资源。
    如果应用本身不支持,且路径上和其他应用有重合,那就只能用域名来区分了。
    我就是 NAS 上一个 NGINX 端口代理所有应用,每个应用分配一个二级域名,这样 NGINX 可以通过访问域名来路由到应用的端口。
    KIMI360
        21
    KIMI360  
       342 天前
    群晖的话直接用内置的反向代理就可以了,可以参考: https://post.smzdm.com/p/awonk4xk/
    ikk098
        23
    ikk098  
       339 天前
    用 nginx proxy manager 吧。 简单易上手
    genicsoft123
        24
    genicsoft123  
       338 天前
    @sworld233 我最近测试了几个网络,发现 frp 速度最快,已经在运行测试。tailscale 也不错不过没有 frp 速度快。zerotier 和 tailscale 差不多。我是把局域网的 GPU 映射到外网去用。效果不错。能跑满我的上行带宽
    qbaidu
        25
    qbaidu  
       332 天前
    location /memos/ {
    proxy_pass http://localhost:30001/memos/;
    }

    第一种要配置的话要这样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2855 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 95ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.