本站架构设计为 **CDN -> 双公网 VPS -> 家中 NAS** 的链路,不仅解决了内网穿透问题,还通过 CDN 隐藏了 VPS IP 并实现了全球加速。以下是架构详细说明: --- ### 1. 架构图 (Mermaid 流程图) ```mermaid graph TD %% 外部访问 User((访客浏览器)) -- "HTTPS (443)" --> CDN{CDN 加速层Cloudflare / 阿里 / 腾讯} %% CDN 转发到源站 subgraph "公网 VPS (香港)" CDN -- "回源 A" --> VPS_A["VPS A (frps)IP: 1.1.1.1Listen: 80, 443"] CDN -- "回源 B" --> VPS_B["VPS B (frps)IP: 2.2.2.2Listen: 80, 443"] end %% TCP 隧道 subgraph "家庭 NAS (PVE 虚拟机)" direction TB subgraph "Ubuntu 24.04 (1Panel VM)" direction LR FRPC_A["frpc 实例 A"] FRPC_B["frpc 实例 B"] subgraph "1Panel 管理容器" Web_Server["OpenResty / Nginx(处理 80/443 流量)"] SSL["SSL 证书管理(自动续签)"] Apps["网站/应用容器"] end end end %% 连接关系 VPS_A <== "TCP Tunnel (frp协议)" ==> FRPC_A VPS_B <== "TCP Tunnel (frp协议)" ==> FRPC_B FRPC_A -- "本地转发" --> Web_Server FRPC_B -- "本地转发" --> Web_Server Web_Server -- "读取证书" --> SSL Web_Server -- "反代" --> Apps %% 样式 style CDN fill:#f9f,stroke:#333,stroke-width:2px style VPS_A fill:#fff4dd,stroke:#d4a017,stroke-width:2px style VPS_B fill:#fff4dd,stroke:#d4a017,stroke-width:2px style Web_Server fill:#d1eaf0,stroke:#2b7a78,stroke-width:2px ``` --- ### 2. 核心技术组件说明 #### **A. 流量入口层 (CDN)** * **功能**:CDN 充当了“流量分发器”。 * **配置**:你在 CDN 后台设置两个**源站 IP**(即 VPS A 和 VPS B 的 IP)。 * **优势**: * **高可用**:如果其中一台 VPS 宕机,CDN 会自动将流量切向另一台。 * **安全**:隐藏了 VPS 的真实 IP,防止被攻击。 * **加速**:香港 VPS 离大陆近,CDN 可以进一步优化全球访问速度。 #### **B. 穿透中转层 (frps)** * **功能**:两台 VPS 仅作为流量透传通道。 * **配置**:`frps.toml` 中开启 `bindPort`,并在安全组开放 80、443 以及 frp 通讯端口。 * **注意**:因为是 TCP 模式,frps 并不处理 SSL 证书,它只管把加密的包传回内网。 #### **C. 逻辑核心层 (Ubuntu 24.04 + 1Panel)** * **frpc 客户端**: * 运行**两个独立进程**(frpc-a 和 frpc-b),分别连接两台 VPS。 * 都将流量转发到 `127.0.0.1:80` 和 `127.0.0.1:443`。 * **1Panel (OpenResty)**: * 这是你的核心 Web 服务器。 * **SSL 终止**:证书配置在这里。当 HTTPS 流量经过 CDN 和 VPS 到达 1Panel 时,由 1Panel 进行解密并根据域名分发给不同的容器。 * **自动化**:1Panel 自带的 ACME 脚本可以自动续签证书。 --- ### 3. 配置关键点建议 1. **frpc 配置 (TOML 格式)**: 在 `frpc_A.toml` 和 `frpc_B.toml` 中,记得给 `proxies` 起**不同的名字**(虽然它们连接不同的服务端,但养成好习惯防止混淆),例如: ```toml # frpc_A.toml 示例 [[proxies]] name = "web-http-vps-a" type = "tcp" localIP = "127.0.0.1" localPort = 80 remotePort = 80 [[proxies]] name = "web-https-vps-a" type = "tcp" localIP = "127.0.0.1" localPort = 443 remotePort = 443 ``` 2. **CDN 回源设置**: * 在 CDN 设置中,**回源协议**请务必选择 **"跟随协议"** 或 **"HTTPS"**。 * 既然 1Panel 处理证书,CDN 到 VPS 的这一段也应该是加密的(即 CDN 访问 VPS 的 443 端口)。 3. **获取真实 IP**: * 由于使用了 TCP 穿透,1Panel 默认看到的 IP 是 `127.0.0.1`。 * 如果你需要统计访客真实 IP,由于你最前面有 CDN,你需要在 1Panel 的 OpenResty 配置中通过 `set_real_ip_from` 信任 CDN 的 IP 段,并读取 `X-Forwarded-For` 请求头。 这个方案非常稳健,即便是其中一台 VPS 的网络出现波动,你的网站依然能通过另一台 VPS 保持在线。 Loading... 本站架构设计为 **CDN -> 双公网 VPS -> 家中 NAS** 的链路,不仅解决了内网穿透问题,还通过 CDN 隐藏了 VPS IP 并实现了全球加速。以下是架构详细说明: --- ### 1. 架构图 (Mermaid 流程图) ```mermaid graph TD %% 外部访问 User((访客浏览器)) -- "HTTPS (443)" --> CDN{CDN 加速层<br/>Cloudflare / 阿里 / 腾讯} %% CDN 转发到源站 subgraph "公网 VPS (香港)" CDN -- "回源 A" --> VPS_A["<b>VPS A (frps)</b><br/>IP: 1.1.1.1<br/>Listen: 80, 443"] CDN -- "回源 B" --> VPS_B["<b>VPS B (frps)</b><br/>IP: 2.2.2.2<br/>Listen: 80, 443"] end %% TCP 隧道 subgraph "家庭 NAS (PVE 虚拟机)" direction TB subgraph "Ubuntu 24.04 (1Panel VM)" direction LR FRPC_A["frpc 实例 A"] FRPC_B["frpc 实例 B"] subgraph "1Panel 管理容器" Web_Server["OpenResty / Nginx<br/>(处理 80/443 流量)"] SSL["SSL 证书管理<br/>(自动续签)"] Apps["网站/应用容器"] end end end %% 连接关系 VPS_A <== "TCP Tunnel (frp协议)" ==> FRPC_A VPS_B <== "TCP Tunnel (frp协议)" ==> FRPC_B FRPC_A -- "本地转发" --> Web_Server FRPC_B -- "本地转发" --> Web_Server Web_Server -- "读取证书" --> SSL Web_Server -- "反代" --> Apps %% 样式 style CDN fill:#f9f,stroke:#333,stroke-width:2px style VPS_A fill:#fff4dd,stroke:#d4a017,stroke-width:2px style VPS_B fill:#fff4dd,stroke:#d4a017,stroke-width:2px style Web_Server fill:#d1eaf0,stroke:#2b7a78,stroke-width:2px ``` --- ### 2. 核心技术组件说明 #### **A. 流量入口层 (CDN)** * **功能**:CDN 充当了“流量分发器”。 * **配置**:你在 CDN 后台设置两个**源站 IP**(即 VPS A 和 VPS B 的 IP)。 * **优势**: * **高可用**:如果其中一台 VPS 宕机,CDN 会自动将流量切向另一台。 * **安全**:隐藏了 VPS 的真实 IP,防止被攻击。 * **加速**:香港 VPS 离大陆近,CDN 可以进一步优化全球访问速度。 #### **B. 穿透中转层 (frps)** * **功能**:两台 VPS 仅作为流量透传通道。 * **配置**:`frps.toml` 中开启 `bindPort`,并在安全组开放 80、443 以及 frp 通讯端口。 * **注意**:因为是 TCP 模式,frps 并不处理 SSL 证书,它只管把加密的包传回内网。 #### **C. 逻辑核心层 (Ubuntu 24.04 + 1Panel)** * **frpc 客户端**: * 运行**两个独立进程**(frpc-a 和 frpc-b),分别连接两台 VPS。 * 都将流量转发到 `127.0.0.1:80` 和 `127.0.0.1:443`。 * **1Panel (OpenResty)**: * 这是你的核心 Web 服务器。 * **SSL 终止**:证书配置在这里。当 HTTPS 流量经过 CDN 和 VPS 到达 1Panel 时,由 1Panel 进行解密并根据域名分发给不同的容器。 * **自动化**:1Panel 自带的 ACME 脚本可以自动续签证书。 --- ### 3. 配置关键点建议 1. **frpc 配置 (TOML 格式)**: 在 `frpc_A.toml` 和 `frpc_B.toml` 中,记得给 `proxies` 起**不同的名字**(虽然它们连接不同的服务端,但养成好习惯防止混淆),例如: ```toml # frpc_A.toml 示例 [[proxies]] name = "web-http-vps-a" type = "tcp" localIP = "127.0.0.1" localPort = 80 remotePort = 80 [[proxies]] name = "web-https-vps-a" type = "tcp" localIP = "127.0.0.1" localPort = 443 remotePort = 443 ``` 2. **CDN 回源设置**: * 在 CDN 设置中,**回源协议**请务必选择 **"跟随协议"** 或 **"HTTPS"**。 * 既然 1Panel 处理证书,CDN 到 VPS 的这一段也应该是加密的(即 CDN 访问 VPS 的 443 端口)。 3. **获取真实 IP**: * 由于使用了 TCP 穿透,1Panel 默认看到的 IP 是 `127.0.0.1`。 * 如果你需要统计访客真实 IP,由于你最前面有 CDN,你需要在 1Panel 的 OpenResty 配置中通过 `set_real_ip_from` 信任 CDN 的 IP 段,并读取 `X-Forwarded-For` 请求头。 这个方案非常稳健,即便是其中一台 VPS 的网络出现波动,你的网站依然能通过另一台 VPS 保持在线。 打赏 赞赏作者 支付宝微信 赞 2 如果觉得我的文章对你有用,请随意赞赏