本文档介绍了 frp (Fast Reverse Proxy) 的各种部署方法,包括从源码构建、使用预编译二进制文件以及容器化部署。它涵盖了构建系统的架构、交叉编译能力以及 frps (服务器) 和 frpc (客户端) 组件的官方分发机制。
有关部署后配置的信息,请参阅 配置。
frp 提供了多种部署选项,以适应不同的环境和需求。下图说明了主要的可用部署路径
来源: Makefile1-71 Makefile.cross-compiles1-38 package.sh1-75 .github/workflows/build-and-push-image.yml1-84 .github/workflows/goreleaser.yml1-31
从源码构建 frp 提供了最大的灵活性,并允许自定义构建过程。
基本构建过程使用项目的 Makefile 为当前平台编译 frpc 和 frps 二进制文件。
Makefile 定义了以下关键目标
make: 运行环境检查、代码格式化,并构建 frpc 和 frpsmake frpc: 仅构建客户端二进制文件make frps: 仅构建服务器二进制文件make clean: 删除生成的二进制文件来源: Makefile5-71
frp 使用 Makefile.cross-compiles 文件支持交叉编译到多种操作系统和架构。
交叉编译过程会为以下组合生成二进制文件
交叉编译系统定义在 Makefile.cross-compiles 中,并使用相应的构建标志处理每个操作系统-架构组合。
来源: Makefile.cross-compiles1-38
交叉编译后,您可以使用 package.sh 脚本来创建分发包。
该脚本
release/packages/ 目录中创建包.zip 归档文件.tar.gz 归档文件来源: package.sh1-75
frp 为 frpc 和 frps 组件都提供了官方 Docker 镜像,提供容器化部署选项。
官方镜像可在 DockerHub 和 GitHub Container Registry 上获取。
| 组件 | DockerHub | GitHub Container Registry |
|---|---|---|
| frpc | fatedier/frpc | ghcr.io/fatedier/frpc |
| frps | fatedier/frps | ghcr.io/fatedier/frps |
运行 frps 服务器
运行 frpc 客户端
您可以使用提供的 Dockerfiles 构建自定义 Docker 镜像。
Dockerfiles 使用多阶段构建过程。
来源: dockerfiles/Dockerfile-for-frpc1-15 dockerfiles/Dockerfile-for-frps1-15 .github/workflows/build-and-push-image.yml1-84
frp 包含 GitHub Actions 工作流程,用于自动化构建和发布,从而促进持续集成和部署。
该项目包含几个用于自动化任务的 GitHub Actions 工作流程
构建和推送 Docker 镜像 (.github/workflows/build-and-push-image.yml)
GoReleaser (.github/workflows/goreleaser.yml)
代码质量 (.github/workflows/golangci-lint.yml)
来源: .github/workflows/build-and-push-image.yml1-84 .github/workflows/goreleaser.yml1-31 .github/workflows/golangci-lint.yml1-43 .circleci/config.yml1-17
frp 包含复杂的重试机制,以确保部署的稳定性。 BackoffManager 接口提供了一种实现指数退避(带抖动)的方法,以在不稳定的环境中实现更可靠的重连。
关键组件
FastBackoffManager: 实现带有可配置参数的退避BackoffUntil: 用于带有退避的定期重试操作的函数Until: 用于更简单的定期重试的函数这些机制在 frp 的不稳定的网络环境部署中特别有用,可以确保临时故障无需手动干预。
来源: pkg/util/wait/backoff.go1-176 pkg/util/util/util.go1-137
frp 提供多种部署选项,以适应不同的环境和需求
| 部署方法 | 用例 | 优点 |
|---|---|---|
| 从源代码构建 | 开发、定制 | 完全控制,最新功能 |
| 预编译二进制文件 | 生产、快速设置 | 简单,广泛的平台支持 |
| Docker 容器 | 容器化环境 | 隔离、编排支持 |
每种部署方法都得到一个具有交叉编译能力和 CI/CD 集成的强大构建系统的支持。
有关部署 frp 后如何配置的信息,请参考 配置 页面。