看到这个标题是否在想:这不是轻轻松松吗?边缘设备通过 frp 内网穿透到一个公网服务器,公网服务器上的 Caddy 反代一下穿透过来的流量,再在 Cloudflare(或任何 DNS 服务商)上配一下 DNS 解析不就行了?
确实是这样 🤓,但是这是一个固定的工作流,如果边缘设备要同时起很多 HTTP 服务,重复的工作就很麻烦。于是我开发了一个 Orion 工具,可以一键完成上面的任务。预期效果是:
在没有公网 IP 的边缘设备上运行下面脚本:
1 | orion serve -n my_service -p 8000 -- ./your_service |
运行之后,即可在 https://my_service.example.com 上访问到这个服务。
也可以在边缘设备上查看已经运行的服务以及健康情况:
1 | soulter@ubuntu:~/orion-linux-arm64-v0.0.2$ ./bin/orion list |
过程
1 | Browser -> Cloudflare DNS -> Caddy -> frps(vhostHTTPPort) -> frpc -> local service |
FRP
frp 支持 HTTP 模式,可以在 frp 客户端中用 type = "http" 注册一个代理并指定 customDomains,frp 服务端就可以通过 HTTP 的 Host 头把请求路由到对应的边缘服务。
frp 客户端的代理配置大概长这样:
1 | [[proxies]] |
需要在 frp 服务端中配置 vhostHTTPPort,这个参数是专门用来接收 HTTP 请求的监听端口。
DNS
在 Cloudflare 等 DNS 解析服务商中配置通配符域名,比如 *.example.com,并解析到 frp 服务器的机器公网 IP。这样之后新增新的子域名时就不需要重新配置 DNS 了。
Web Server
如果只有 frp,其实也可以直接把 vhostHTTPPort 暴露出去,设置 vhostHTTPPort=80 即可。使用 Web Server 会更加优雅一些。这里我使用了 Caddy,它是一个更好用的类似 nginx, apache 的 Web Server,它的配置文件非常现代化,不像 nginx.conf 那样复杂,并且最大的优点是可以可以自动申请并续期 Let’s Encrypt 通配符证书。
因为通配符证书需要 DNS Challenge,所以这里我用了 Caddy 的 Cloudflare DNS 能力。配置大概是这样:
1 | { |
Orion
Orion 其实就是一个很简单的 frp wrapper,在配置好 Caddy、Cloudflare 之后,使用 Orion 可以一键部署边缘服务,类似:
1 | orion up -n my_service -p 8000 # 后台运行模式 |
然后就能直接访问:
1 | https://my-service.example.com |
Orion 默认使用的 vhostHTTPPort 是 38399,因此 Caddy 那里的 reverse_proxy 的端口直接写 38399 即可。