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

311 天前
 sworld233

看到了帖子 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 的服务有没有一些最佳实践?恳请大家说说自己的看法

3618 次点击
所在节点    NAS
25 条回复
Hconk
311 天前
我是用 nginx proxy manager 来管理,内网 nas 装了很多服务,通过 frp 穿透到有公网 ip 服务器上,然后 NPM 上配置多个二级域名通过内网 ip 访问本机 frp 映射过来的不同端口,只需要对外暴露 80 端口就可以,用 NPM 还有一个好处就是很方便加认证和 https ,基本不用手写配置。我这么用 memos 没遇到什么问题。不过你好像是家宽,没有 80 端口,不确是不是能这么做,可以试试。
xinmans
311 天前
npm 足够了,我在 n1 盒子上装了 npm ,还支持 ssl 证书签发,爽的一笔,和 AIO 解耦
ysc3839
311 天前
建议分域名
ysc3839
311 天前
按理说不会端口冲突,请发出完整配置文件和错误日志
yin1999
311 天前
最后一版的配置,尝试移除第二个 server 块中的 ipv6only=on 。对于 webdav 应该只能用 sni 来分流了
sworld233
311 天前
@ysc3839
@yin1999
经过测试,确实是 ipv6only=on 导致端口冲突,只要去掉就不会冲突了,感谢!
sworld233
311 天前
@xinmans
@Hconk
我刚才试了一下,这个是否就是提供了方便的 nginx 的 web 操作界面?我在按照 yin1999 的说法改动后 qbit 、gitea 都能正常访问使用了,除了 memos 返回 502 。我确实没有 80 接口,也因此 NPM 貌似不能自动配置 https ,不过我找到了 certbot 的手动操作方法,文档中也指出可以用一个脚本实现自动认证
benjaminliangcom
311 天前
我用 traefik ,可以配置 mTls ,只有安装了客户端证书的才能连接
LeeReamond
311 天前
老哥是公网暴露 nas 的 ipv6 然后解析直连吗,还是有中转的模式
Wovvvv
311 天前
兄弟,第一次玩这个不是很明白,我的方案是使用家宽,跟你一样使用的 ipv6 公网 ip ,端口没有 443 有 80 ,这样可不可以使用 https 加密吗?
lm930129
311 天前
@Wovvvv 443 和 https 没有必然关系,你用其他端口一样可以 https
wyxls
311 天前
在 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
311 天前
上二级域名方便一点 推荐使用 lucky 替换 nginx 配置更简单
wyxls
311 天前
@Xingchen366 lucky 的 webui 比起 npm 配置反代更加“死板”,勉强够用
sworld233
311 天前
@LeeReamond 是解析直连的

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

去年 5 月份官方就有 PR 简单修复,但是一直没 merge
[官方 PR#2756]( https://github.com/NginxProxyManager/nginx-proxy-manager/pull/2756)
genicsoft123
311 天前
装个面板吧,方便很多,另外搭配 frp 用,外网穿透更方便,或者结合 tailscale 用
sworld233
311 天前
@genicsoft123 我现在是装了 NPM ,域名指向 v6 地址,然后又接入了 zeroter
xinmans
311 天前
@sworld233 memos 我用 npm 实现了 https 访问,主要是增加证书
libook
311 天前
需要应用本身支持自定义子路径,比如假设 memos 配置项里支持设置自定义子路径,那么你可以设置子路径为/memos ,这样 memos 就是去/mrmos/asserts 找资源。
如果应用本身不支持,且路径上和其他应用有重合,那就只能用域名来区分了。
我就是 NAS 上一个 NGINX 端口代理所有应用,每个应用分配一个二级域名,这样 NGINX 可以通过访问域名来路由到应用的端口。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1010494

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX