文章

多服务场景:FRP + Nginx 实现统一 HTTPS 域名管理

多服务场景:FRP + Nginx 实现统一 HTTPS 域名管理

在日常使用 NAS、树莓派、内网开发机等设备时,常常会遇到一个问题:
这些机器没有公网 IP,没办法直接配置 HTTPS 域名。
这时候 FRP 内网穿透 就能派上用场。

本文将介绍如何使用 FRP + Nginx,实现多个服务共享一个 VPS,对外暴露不同的 HTTPS 域名


一、架构说明

整体流程如下:

1
[本地服务] → frpc → [VPS frps:8080] ← Nginx ← 用户浏览器(https://xxx.example.com)
  • 客户端 (frpc):运行在内网机器(NAS、开发机),只需配置 frpc,不用管证书。

  • 服务端 (frps):运行在 VPS,接收 frpc 的请求。

  • Nginx:运行在 VPS,统一做 HTTPS + 域名转发,管理证书。

  • 最终效果:不同服务对应不同域名,均可通过 HTTPS 安全访问。


二、服务端 frps 配置

编辑 /etc/frp/frps.toml

1
2
3
4
bindPort = 7000

# 接收 HTTP 流量的端口(frpc -> frps)
vhostHTTPPort = 8080

注意:不需要 vhostHTTPSPort,因为 HTTPS 统一交给 Nginx。

启动服务端:

1
frps -c /etc/frp/frps.toml

三、客户端 frpc 配置

假设你的 NAS 上有两个服务:

  • 博客服务:127.0.0.1:6699

  • 相册服务:127.0.0.1:8899

frpc.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
serverAddr = "vps.example.com"
serverPort = 7000

# 博客
[[proxies]]
name = "blog"
type = "http"
localIP = "127.0.0.1"
localPort = 6699
customDomains = ["blog.example.com"]

# 相册
[[proxies]]
name = "photos"
type = "http"
localIP = "127.0.0.1"
localPort = 8899
customDomains = ["photos.example.com"]

启动 frpc:

1
frpc -c frpc.toml

四、Nginx 配置(VPS)

VPS 上的 Nginx 负责 443 端口的证书,并根据域名转发到 frps 的 8080

博客站点 /etc/nginx/sites-enabled/blog.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
    listen 80;
    listen 443 ssl http2;
    server_name blog.example.com;

    ssl_certificate     /etc/letsencrypt/live/blog.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

相册站点 /etc/nginx/sites-enabled/photos.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
    listen 80;
    listen 443 ssl http2;
    server_name photos.example.com;

    ssl_certificate     /etc/letsencrypt/live/photos.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/photos.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

五、DNS 配置

将域名解析到 VPS 公网 IP:

1
2
blog.example.com   → VPS 公网 IP
photos.example.com → VPS 公网 IP

六、证书管理

在 VPS 上统一申请证书(推荐 certbot / acme.sh):

1
sudo certbot --nginx -d blog.example.com -d photos.example.com

证书自动续期由 VPS 负责,内网机器无需关心。


七、最终效果

  • https://blog.example.com → 内网博客(6699)

  • https://photos.example.com → 内网相册(8899)

  • 多个服务共用 443 端口,不用再写一堆端口转发规则。

  • 证书集中管理,简化维护。


总结

通过 FRP + Nginx,我们实现了:

  1. 内网多服务统一使用 HTTPS 域名访问。

  2. 客户端机器(NAS、开发机)完全不用管证书。

  3. VPS 上集中管理域名和证书,配置简单,运维轻松。

这是一种非常适合 NAS、自建服务用户的方式,既安全又优雅。 🚀


本文由作者按照 CC BY 4.0 进行授权