本文最后更新于 2026年5月18日。
我想要的不是代理单个网站,这样的我的openresty已经实现了,我想要的效果是,域名解析到vps,我的vps直接把域名发给nas,内网穿透我已经做好了,然后nas根据域名返回对应的网站数据
VPS 上的 OpenResty 只是把请求当成普通的 HTTP 流量转发,导致你每增加一个子域名,都得在 VPS 和 NAS 上各配置一遍。
你想要的本质是 “透明转发”:VPS 只做一个流量的“搬运工”,把所有 *.yourdomain.com 的原始请求(保留 Host 头)打包扔给内网 NAS,由 NAS 上的 Nginx 或应用根据域名自行分发。
以下是实现“一次设置,终身免动 VPS”的两种最快方案:
方案一:OpenResty / Nginx 泛域名反向代理(最灵活)
不需要在 VPS 上为每个子域名写 server 块,利用 泛域名匹配 和 变量,你可以把所有流量直接甩给内网。
在 VPS 的 OpenResty 配置中修改:
Nginx
server {
listen 80;
listen 443 ssl;
server_name *.yourdomain.com yourdomain.com; # 匹配所有子域名
# SSL 证书建议配置在这里(泛域名证书),方便 VPS 卸载流量
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080; # 这里的 8080 是你内网穿透(如 frp)在 VPS 上监听的本地端口
# 关键:必须传递 Host 头,否则 NAS 不知道用户访问的是哪个域名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 允许长连接,提高性能
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
原理: 当用户访问 blog.yourdomain.com 时,VPS 匹配到泛域名规则,通过 $host 变量把“我想访问 blog”这个信息传给 NAS。NAS 上的 Web 服务收到请求后,识别出 Host 是 blog,就会自动跳转到对应的站点。
方案二:Stream 模块四层转发(最彻底)
如果你希望 VPS 连 SSL 证书都不管,直接把原始的加密数据包(TCP 流量)转发给 NAS(由 NAS 负责 SSL 握手),你可以使用 Nginx 的 stream 模块。
在 VPS 的 nginx.conf 中(注意不在 http 块内):
Nginx
stream {
map $ssl_preread_server_name $backend_name {
hostnames;
*.yourdomain.com nas_server;
yourdomain.com nas_server;
}
upstream nas_server {
server 127.0.0.1:7000; # 内网穿透的穿透端口
}
server {
listen 443;
proxy_pass $backend_name;
ssl_preread on; # 关键:预读 SNI 信息但不解密
}
}
优点:
-
零配置: VPS 不需要安装任何证书,完全透传。
-
极简: 只要内网穿透隧道通了,VPS 就像一根网线,以后你在 NAS 上加 100 个网站,VPS 都不用动一下。
关键检查点
-
内网穿透配置: 确保你的 Frp 或其他工具配置的是 TCP 模式(对应方案二)或者 HTTP 模式(对应方案一)。
-
NAS 端的接收: NAS 上需要有一个“总管”服务(如 Nginx Proxy Manager 或另一个 OpenResty),它配置了具体的
server_name来承接从 VPS 传过来的流量。 -
泛域名解析: 确保你的域名 DNS 解析中,
*记录已经指向了 VPS 的 IP。