VPS、Mac mini、Frp 搭建内网穿透家用服务器

通过阿里云 VPS 提供的公网 IP,使用 FRP 实现内网穿透到家里的 Mac mini。
杭州
VPS、Mac mini、Frp 搭建内网穿透家用服务器

为什么这么设计

核心问题:

  • 家里的 Mac mini 性能强劲,但没有公网 IP,无法直接从外网访问
  • 阿里云 VPS 有公网 IP,但配置较低(2 核 2G),性能不足以运行复杂服务

解决方案:

  • VPS 负责流量转发:利用公网 IP 作为流量入口,通过 Nginx + FRP 将请求转发到内网
  • Mac mini 负责实际服务:利用强劲性能运行各种 Docker 服务,处理真正的业务逻辑

这样既解决了公网访问问题,又充分利用了现有硬件资源,避免购买高配 VPS 的额外成本。

概览

阿里云 VPS + Mac mini 低成本搭建家服务器

流量流向

当用户访问你的服务时,请求的完整路径如下:

        用户浏览器 → VPS 公网 IP (443/80)

    Nginx 接收并转发

    FRPS (8090) 接收 HTTP 流量

    通过 FRP 隧道 (7100) 传输

    Mac mini FRPC 接收

    转发到本地 Docker 容器 (4321/4322/4323...)

    容器处理请求并返回响应
      

整个过程中,VPS 只负责流量中转,真正的业务逻辑都在 Mac mini 的 Docker 容器中处理。

VPS

Nginx

  • 流量转发:通过 443/80 端口接收外部流量,并转发至本地 8090 端口(FRPS 服务)
        server {
   listen 443 ssl http2; # 监听 443 端口(HTTPS)并启用 SSL 和 HTTP/2
   ...

   # 代理配置 - 将请求转发到本地 8090 端口
   location / {
      proxy_pass http://localhost:8090;
      ...
   }
}
      

FRPS

一个快速反向代理,帮助你将 NAT 或防火墙后的本地服务器暴露到互联网

  • 流量桥接:接收 8090 端口的 HTTP 流量,通过 7100 端口与客户端建立隧道连接
        bindPort = 7100  # FRPS(服务端)与 FRPC(客户端)建立隧道通信的主要端口
auth.token = "******"  # 客户端和服务端之间的认证 Token

vhostHTTPPort = 8090  # FRPS 用于对外暴露 HTTP 服务的端口

# 管理面板(Dashboard)
webServer.port = 7500  # 管理面板端口
webServer.user = "admin"
webServer.password = "******"
webServer.addr = "0.0.0.0"  # 允许所有 IP 访问(公网可访问)
      

Mac Mini

FRPC 客户端

Mac mini 通过 FRPC 客户端与 VPS 建立隧道,并通过 [[proxies]] 配置实现多域名分流

  • 隧道连接:与 VPS 上的 FRPS 服务建立稳定连接
  • 多域名代理:通过 [[proxies]] 配置实现不同域名到本地端口的映射
        [[proxies]]
name = "blog"
type = "http"
localPort = 4321 # 个人博客服务
customDomains = ["blog.example.com"]

[[proxies]]
name = "api"
type = "http"
localPort = 4322 # API 服务
customDomains = ["api.example.com"]

[[proxies]]
name = "dashboard"
type = "http"
localPort = 4323 # 管理面板
customDomains = ["admin.example.com"]
      

这里的 localPort 对应的并不一定是 Mac mini 本机的实际端口,大多数情况下是运行在 Docker 容器中的应用服务。

例如:
4321 → API 服务容器(如 FastAPI、Node.js)
4322 → Nginx 容器,用于个人博客或静态站点

换句话说,FRPC 就像”公网入口”,而 Docker 是”本地应用商店”:你在 Mac mini 上随时可以用 Docker 启动一个新服务,分配一个本地端口,然后只需在 FRPC 配置中增加一个 [[proxies]],几秒钟就能让它通过独立域名对外提供访问。