
在写这篇文章之前,我先抛几个关键词:frp 内网穿透、自定义域名访问、http代理、vhostHTTPPort、https代理。这些问题在我日常开发和搭建测试环境的时候,经常会遇到,尤其是当你想把家里或者公司内网的一些 Web 服务,通过一个漂亮的域名暴露给外部访问时,frp 就成了非常好用的利器。

HTTP 类型的代理特别适合这种场景,它不仅能通过自定义域名将内网服务暴露出去,还支持端口复用,避免多个服务占用不同的端口。相比 TCP 类型代理,HTTP 代理更灵活,也能结合 HTTP 协议的特性做一些扩展。而如果是 HTTPS 服务,还需要额外注意 TLS 终止问题,frps 端并不会自动帮你做 TLS 解密,这点很多人第一次使用时会踩坑。这里可以通过 https2http 插件,让内网 HTTP 服务以 HTTPS 协议对外暴露。
首先需要配置服务端的 frps.toml,这里我指定了 HTTP 请求监听端口为 8080,同时服务端和客户端之间通信端口为 7000:
bindPort = 7000
vhostHTTPPort = 8080如果你有 HTTPS 代理需求,还可以加上:
vhostHTTPSPort = 8443这样就能同时支持 HTTP 和 HTTPS。
接下来是客户端配置文件 frpc.toml,重点在于指定服务端的 IP、本地 Web 服务端口,以及绑定的自定义域名:
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "web"
type = "http"
localPort = 80
customDomains = ["www.yourdomain.com"]
[[proxies]]
name = "web2"
type = "http"
localPort = 8080
customDomains = ["www.yourdomain2.com"]这里我演示了两个服务:
web → 本地 80 端口绑定到 www.yourdomain.comweb2 → 本地 8080 端口绑定到 www.yourdomain2.com服务端运行:
./frps -c ./frps.toml客户端运行:
./frpc -c ./frpc.toml保证两个进程都正常启动。
这一步非常关键。要让浏览器能访问到服务,需要把域名解析到服务器的 IP 地址。
www.yourdomain.com → x.x.x.xwww.yourdomain2.com → x.x.x.x甚至有些场景下,通过修改 HTTP 请求的 Host 字段,也能实现相同的效果。
配置完成后,直接用浏览器访问即可:
http://www.yourdomain.com:8080 → 内网 80 端口服务http://www.yourdomain2.com:8080 → 内网 8080 端口服务这样就实现了通过自定义域名,访问不同的内网服务。
通过 HTTP 类型代理,frp 能够轻松把内网 Web 服务暴露到公网,并且还能支持多个自定义域名和端口复用,特别适合开发测试环境。如果想进一步提供 HTTPS 支持,可以结合 https2http 插件,或者直接让本地 Web 服务启用 HTTPS,然后在 frpc 里走 type = "https" 配置。
这套配置整体非常简单,但也有几个容易忽视的点:
frps 和 frpc 的端口一定要打通,服务器要开放对应防火墙规则。customDomains 必须和你解析的域名一致,否则访问时会出现 404。:8080 端口,可以在服务器上用 Nginx 做反向代理,把 80 端口流量转发给 frp。这样一来,不管你是要暴露内网的管理后台,还是本地测试项目,都能非常方便地实现外部访问。