frp + Nginx 反代 + 泛域名证书(vpspve.com)完整步骤说明
一、环境说明
VPS:
公网 IP:VPs(示例)
系统:Ubuntu(其他 Linux 也类似)
已安装:nginx
内网:
PVE1:192.168.0.96:8006,对应域名 pve.vpspve.com
PVE2:192.168.0.98:8006,对应域名 pve98.vpspve.com
网关:192.168.0.1(OpenWrt)
域名:
主域名:vpspve.com,托管在 Cloudflare
使用子域名访问内网服务:
pve.vpspve.com → 192.168.0.96:8006
pve98.vpspve.com → 192.168.0.98:8006
后续可以扩展:openwrt.vpspve.com、fn.vpspve.com 等
统一约定:
frps 监听端口:7000(TCP)
frp 认证方式:token
token 示例:88673710sf
所有子域共用一个泛域名证书:vpspve.com + *.vpspve.com
证书统一路径:
/etc/nginx/ssl/vpspve.key
/etc/nginx/ssl/vpspve.pem
二、VPS 上安装 & 配置 frps(服务端)
下载 frp
cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.56.0/frp_0.56.0_linux_amd64.tar.gz
tar -zxvf frp_0.56.0_linux_amd64.tar.gz
mv frp_0.56.0_linux_amd64 frp
cd /opt/frp
创建 frps.toml
nano /opt/frp/frps.toml
填入:
bindPort = 7000
auth.method = “token”
auth.token = “88673710sf”
保存退出。
前台测试运行
cd /opt/frp
./frps -c frps.toml
看到类似输出:
frps uses config file: frps.toml
frps tcp listen on 0.0.0.0:7000
frps started successfully
按 Ctrl + C 停止,用后台方式运行。
后台常驻运行
cd /opt/frp
nohup ./frps -c frps.toml > /opt/frp/frps.log 2>&1 &
检查端口监听
ss -lntp | grep 7000
出现类似:
LISTEN 0 4096 *:7000 *:* users:((“frps”,pid=xxxx,fd=3))
说明 frps 正常启动。
三、内网 PVE 上安装 & 配置 frpc(客户端)
以下示例以 PVE1(192.168.0.96)和 PVE2(192.168.0.98)为例。
两台 PVE 机器上步骤类似,端口和名称区分开即可。
【前提】
PVE 网络要能出网,并配置好网关,例如:
vmbr0: 192.168.0.96/24, gateway 192.168.0.1
在 PVE 上下载 frp
以 PVE1 为例(192.168.0.96):
cd /root
wget https://github.com/fatedier/frp/releases/download/v0.56.0/frp_0.56.0_linux_amd64.tar.gz
tar -zxvf frp_0.56.0_linux_amd64.tar.gz
mv frp_0.56.0_linux_amd64 frp
cd /root/frp
PVE1 的 frpc 配置(pve.vpspve.com 对应 96)
nano /root/frp/frpc.toml
内容:
serverAddr = “103.149.91.232”
serverPort = 7000
auth.method = “token”
auth.token = “88673710sf”
transport.tcpMux = true
[[proxies]]
name = “pve-web”
type = “tcp”
localIP = “192.168.0.96”
localPort = 8006
remotePort = 39006
PVE2 的 frpc 配置(pve98.vpspve.com 对应 98)
在 192.168.0.98 那台 PVE 上同样下载解压后:
nano /root/frp/frpc.toml
内容:
serverAddr = “103.149.91.232”
serverPort = 7000
auth.method = “token”
auth.token = “88673710sf”
transport.tcpMux = true
[[proxies]]
name = “pve98-web”
type = “tcp”
localIP = “192.168.0.98”
localPort = 8006
remotePort = 39007
注意:
每台内网服务 remotePort 必须不同(39006、39007…)
type 必须是 tcp,用于转发 PVE 的 https 服务
测试启动 frpc(每台 PVE)
cd /root/frp
./frpc -c frpc.toml
正常输出类似:
login to server success
proxy added: [pve-web]
start proxy success
确认正常后可 Ctrl + C 停止,用后台运行。
后台运行 frpc
cd /root/frp
nohup ./frpc -c frpc.toml >/root/frpc.log 2>&1 &
检查:
ps -ef | grep frpc
四、VPS 上配置 Nginx 反向代理(PVE1/PVE2)
目标:
https://pve.vpspve.com
→ VPS:39006 → PVE1:192.168.0.96:8006
https://pve98.vpspve.com
→ VPS:39007 → PVE2:192.168.0.98:8006
确认 /etc/nginx/nginx.conf 包含:
http {
…
include /etc/nginx/sites-enabled/*;
}
创建 pve 站点配置(PVE1)
nano /etc/nginx/sites-available/pve
内容示例:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name pve.vpspve.com;
ssl_certificate /etc/nginx/ssl/vpspve.pem;
ssl_certificate_key /etc/nginx/ssl/vpspve.key;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
location / {
proxy_pass https://127.0.0.1:39006;
proxy_ssl_verify off;
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 https;
proxy_set_header X-Forwarded-Host $host;
}
}
创建 pve98 站点配置(PVE2)
nano /etc/nginx/sites-available/pve98
内容示例:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name pve98.vpspve.com;
ssl_certificate /etc/nginx/ssl/vpspve.pem;
ssl_certificate_key /etc/nginx/ssl/vpspve.key;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
location / {
proxy_pass https://127.0.0.1:39007;
proxy_ssl_verify off;
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 https;
proxy_set_header X-Forwarded-Host $host;
}
}
启用站点
ln -s /etc/nginx/sites-available/pve /etc/nginx/sites-enabled/pve
ln -s /etc/nginx/sites-available/pve98 /etc/nginx/sites-enabled/pve98
检查并重载 nginx
nginx -t
systemctl reload nginx
五、使用 acme.sh + Cloudflare 申请泛域名证书
目标:一次性申请 vpspve.com + *.vpspve.com 泛域名证书,所有子域名共用。
安装 acme.sh
curl https://get.acme.sh | sh
source ~/.bashrc
注册 ZeroSSL 账户(只需一次)
acme.sh –register-account -m 你的邮箱
# 示例:
# acme.sh –register-account -m 262789078@qq.com
设置 Cloudflare API 信息
export CF_Key=”你的Cloudflare Global API Key”
export CF_Email=”你的Cloudflare账号邮箱”
示例:
export CF_Key=”992fb6abf808b3d452a085ac36efbab21d4b3″
export CF_Email=”262789078@qq.com”
使用 DNS 验证申请泛域名证书
acme.sh –issue –dns dns_cf -d vpspve.com -d ‘*.vpspve.com’
成功后会提示:
Your cert is in: /root/.acme.sh/vpspve.com_ecc/vpspve.com.cer
Your cert key is in: /root/.acme.sh/vpspve.com_ecc/vpspve.com.key
fullchain.cer 路径也会显示
创建 Nginx 证书目录并安装证书
mkdir -p /etc/nginx/ssl
acme.sh –install-cert -d vpspve.com \
–key-file /etc/nginx/ssl/vpspve.key \
–fullchain-file /etc/nginx/ssl/vpspve.pem \
–reloadcmd “systemctl reload nginx”
安装成功后,/etc/nginx/ssl 目录下会有:
vpspve.key
vpspve.pem
nginx 会自动 reload。
六、Nginx 统一使用泛域名证书
以后所有站点(pve、pve98、openwrt、飞牛 NAS 等)都统一写:
ssl_certificate /etc/nginx/ssl/vpspve.pem;
ssl_certificate_key /etc/nginx/ssl/vpspve.key;
可以用命令检查:
grep -R “ssl_certificate” /etc/nginx/sites-enabled -n
确认全部站点都指向 vpspve.pem / vpspve.key。
七、以后新增 OpenWrt / 飞牛 NAS 的标准模板
以 OpenWrt(192.168.0.1:80)为例:
1)在内网机器(跑 frpc 的地方)添加新代理
[[proxies]]
name = “openwrt-web”
type = “tcp”
localIP = “192.168.0.1”
localPort = 80
remotePort = 39010
重启 frpc(或 nohup 再启一次)。
2)VPS 上新增 Nginx 配置
nano /etc/nginx/sites-available/openwrt
内容:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name openwrt.vpspve.com;
ssl_certificate /etc/nginx/ssl/vpspve.pem;
ssl_certificate_key /etc/nginx/ssl/vpspve.key;
location / {
proxy_pass http://127.0.0.1:39010;
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 https;
}
}
启用站点并重载:
ln -s /etc/nginx/sites-available/openwrt /etc/nginx/sites-enabled/openwrt
nginx -t
systemctl reload nginx
访问:
https://openwrt.vpspve.com
飞牛 NAS / 其他服务同理,只需:
frpc 增加一个 [[proxies]]
remotePort 换一个新的,例如 39011
nginx 新建一个 server_name 指向这个 remotePort 即可
八、常用排错命令
1)frps 是否在运行(VPS)
ps -ef | grep frps
ss -lntp | grep 7000
tail -n 50 /opt/frp/frps.log
2)frpc 是否在运行(内网)
ps -ef | grep frpc
tail -n 50 /root/frpc.log
3)VPS 上本地测试 frp 转发是否正常
以 PVE1 为例(39006):
curl -vk https://127.0.0.1:39006
4)Nginx 配置检查
nginx -t
systemctl reload nginx
journalctl -xeu nginx.service –no-pager | tail -n 50
5)查看所有已启用站点
ls -l /etc/nginx/sites-enabled/
ystemd 服务托管
✔ PVE 重启后自动运行
✔ frpc 崩溃自动重启
✔ 不需要手动进入目录执行
马上开始!
✅ 第一步:创建 frpc Systemd 服务
运行:
[Unit]
Description=FRPC Client for PVE98
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/root/frp_0.56.0_linux_amd64/frpc -c /root/frp_0.56.0_linux_amd64/frpc.toml
Restart=always
RestartSec=3
# 保证 PATH 不乱
WorkingDirectory=/root/frp_0.56.0_linux_amd64
[Install]
WantedBy=multi-user.target
✅ 第二步:加载 systemd
✅ 第三步:启动 frpc 服务
✅ 第四步:设置开机自动启动
✅ 第五步:检查 frpc 是否成功运行
正常会显示:
接下来建议你加一个更强的增强版(可选但推荐)
让 frpc 自动检测网络恢复、失败自动重连。
在你的 /etc/systemd/system/frpc98.service 里,用这个增强版替换原来的 Service 段:
改完后重新加载:
./frpc -c frpc.toml