内容导航

2026/5/14

FRP 与云端 Nginx:本地服务公网入口

记录 frps/frpc 如何把本地 Debian 服务转发到云服务器,并由云端 Nginx 统一域名入口、备案 fallback 和临时端口收敛。

服务器与部署 FRPNginx内网穿透备案
本文目录

这篇只记录云端入口和 FRP。具体应用如何运行放在 Debian 服务文章,MyBlog 更新放在博客部署文章。

目标结构

公网用户
  -> 云服务器 Nginx 80/443
  -> 127.0.0.1:9001 / 9002 / 9003
  -> frps
  -> frpc
  -> 本地 Debian 服务

当前映射示例:

服务本地端口云端临时端口后续域名
n8n56789001n8n.example.com
MyBlog180809002example.com
小程序服务80009003mini.example.com

备案和 DNS 完成前可以临时使用 IP + 端口。正式后应关闭临时端口,只保留 80/443

frps 配置

bindPort = 7000

auth.method = "token"
auth.token = "<frp-token>"

allowPorts = [
  { start = 9001, end = 9009 },
  { start = 2222, end = 2222 }
]

webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "<dashboard-user>"
webServer.password = "<dashboard-password>"

要点:

  • allowPorts 限制客户端能开的端口。
  • dashboard 只监听本机。
  • auth.token 不公开。

systemd:

[Service]
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=always
RestartSec=3

frpc 配置

serverAddr = "<cloud-ip>"
serverPort = 7000

auth.method = "token"
auth.token = "<frp-token>"

[[proxies]]
name = "n8n"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5678
remotePort = 9001

[[proxies]]
name = "myblog"
type = "tcp"
localIP = "127.0.0.1"
localPort = 18080
remotePort = 9002

[[proxies]]
name = "mini-app"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8000
remotePort = 9003

检查:

sudo systemctl restart frpc
sudo journalctl -u frpc -n 80 --no-pager

云服务器:

ss -lntp | grep -E '7000|9001|9002|9003'
curl -I http://127.0.0.1:9002/

云端 Nginx

域名完成后,云 Nginx 反代到 FRP 本机端口:

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1:9002;
        proxy_http_version 1.1;
        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_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_connect_timeout 3s;
        proxy_read_timeout 30s;
        proxy_send_timeout 30s;

        error_page 502 503 504 = @beian_fallback;
    }

    location @beian_fallback {
        root /var/www/beian;
        try_files /index.html =200;
    }
}

备案页:

sudo mkdir -p /var/www/beian
sudo nano /var/www/beian/index.html

安全组

建议:

80/tcp     0.0.0.0/0
443/tcp    0.0.0.0/0
22/tcp     固定公网 IP 或小网段
7000/tcp   本地 Debian 出口 IP
9001/tcp   临时开放
9002/tcp   临时开放
9003/tcp   临时开放

不要开放“所有流量全端口”。

正式域名完成后删除:

9001/tcp
9002/tcp
9003/tcp

排障

502:

curl -I http://127.0.0.1:9002/
sudo journalctl -u frps -n 80 --no-pager
sudo tail -n 80 /var/log/nginx/error.log

认证失败:

frps 和 frpc 的 auth.token 不一致。

端口不允许:

remotePort 不在 allowPorts 范围内。

评论

Giscus 评论尚未配置。填写 GitHub Discussions 的仓库和分类 ID 后,这里会显示评论区。