1. 项目背景与需求分析
最近在开发苍穹外卖项目时遇到了一个典型的联调问题:前端代码部署在云服务器上,而后端服务运行在本地开发环境。由于云服务器拥有公网IP,而本地开发环境处于内网NAT之后,导致前端请求无法直接访问到本地的后端服务。这种场景在前后端分离开发中非常常见,特别是当团队需要快速验证线上环境与本地API的兼容性时。
传统解决方案通常有以下几种:
- 将后端代码也部署到云服务器 - 但每次修改都需要重新部署,开发效率低下
- 使用ngrok等商业内网穿透工具 - 存在免费版连接不稳定、收费版成本高的问题
- 临时修改前端代码中的API地址 - 容易造成代码污染,且需要反复修改
经过技术调研,最终选择了FRP(Fast Reverse Proxy)这个开源工具来解决这个问题。FRP采用C/S架构,通过在公网服务器部署服务端(frps),在内网主机运行客户端(frpc),建立"反向隧道"将内网服务安全地映射到公网。相比其他方案,FRP具有以下优势:
- 完全开源且免费
- 支持TCP/UDP/HTTP/HTTPS多种协议
- 配置灵活,性能稳定
- 社区活跃,文档完善
2. FRP技术原理详解
2.1 核心架构与工作流程
FRP采用经典的反向代理模式,其核心组件包括:
- frps(服务端):部署在具有公网IP的云服务器上,监听特定端口(默认7000),负责接收外部请求并转发给对应的frpc客户端
- frpc(客户端):运行在内网主机上,主动连接到frps,注册需要暴露的本地服务
工作流程如下:
- frpc启动后主动与frps建立控制连接
- 当外部请求到达frps的特定端口时
- frps通过已建立的控制连接通知frpc
- frpc创建到本地服务的连接,开始数据转发
- 所有通信数据通过这条"隧道"进行传输
2.2 关键配置参数解析
在FRP的配置文件中,有几个关键参数需要特别注意:
服务端(frps.toml)核心参数:
toml复制bindAddr = '0.0.0.0' # 监听所有网络接口
bindPort = 7000 # 控制连接端口
auth.method = "token" # 认证方式
auth.token = "..." # 认证令牌,客户端需匹配
# 可选Dashboard配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin123"
客户端(frpc.toml)核心参数:
toml复制serverAddr = "x.x.x.x" # frps服务器IP
serverPort = 7000 # 对应frps的bindPort
auth.method = "token"
auth.token = "..." # 必须与服务端一致
[[proxies]]
name = "service-name" # 服务标识
type = "tcp" # 协议类型
localIP = "127.0.0.1" # 本地服务IP
localPort = 8080 # 本地服务端口
remotePort = 18080 # 服务端暴露端口
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容