本文档介绍了frp如何加载和处理不同格式的配置文件,包括模板渲染、环境变量替换和旧格式兼容性。有关特定配置选项的信息,请参阅服务器配置和客户端配置。
frp提供了一个灵活的配置系统,支持多种文件格式、基于模板的配置生成以及现代和旧配置格式的无缝处理。配置加载系统处理
frp支持多种配置格式
| 格式 | 描述 | 文件扩展名 |
|---|---|---|
| YAML | 现代配置的默认格式 | .yaml, .yml |
| JSON | 具有更严格语法的替代格式 | .json |
| TOML | 现代配置的替代格式 | .toml |
| INI | 旧格式(为向后兼容仍受支持) | .ini |
配置加载过程遵循一系列步骤来解析、验证和准备配置供frp客户端或服务器使用。
来源:pkg/config/load.go160-187 pkg/config/load.go190-261
frp支持基于模板的配置,并进行环境变量替换。这允许根据运行时变量动态生成配置。
环境变量在初始化时加载,并提供给模板。模板系统还提供自定义函数来解析数字范围。
来源:pkg/config/load.go39-61 pkg/config/load.go82-96
可以使用Go模板语法在配置文件中使用环境变量。例如:
# Template using environment variables
serverAddr = "{{ .Envs.FRP_SERVER_ADDR }}"
serverPort = {{ .Envs.FRP_SERVER_PORT }}
加载配置时,将处理这些模板,并替换环境变量。
来源:pkg/config/load.go41-51 pkg/config/load.go97-104
以下图表显示了加载配置文件的代码流程
来源:pkg/config/load.go106-112 pkg/config/load.go113-142
加载服务器配置时,frp首先检查文件是否为旧的INI格式。如果是,它会在内部将其转换为新格式。
服务器配置使用LoadServerConfig加载,该函数返回配置、一个指示是否从旧格式加载的布尔值以及发生的任何错误。
来源:pkg/config/load.go161-188 pkg/config/legacy/server.go219-267
客户端配置加载比服务器配置加载更复杂,因为它处理代理配置和访问者配置,以及额外的包含的配置文件。
客户端配置加载还支持通过“start”列表过滤代理,允许选择性地仅启用特定代理。
来源:pkg/config/load.go190-262 pkg/config/load.go264-300 pkg/config/legacy/client.go204-290
frp通过检测和内部转换为新格式来保持与旧INI配置格式的向后兼容性。
通过尝试将文件加载为INI文件并检查它是否包含名为“common”的部分来完成检测
来源:pkg/config/load.go63-80 pkg/config/legacy/client.go172-200 pkg/config/legacy/server.go220-238
旧配置使用转换函数转换为现代格式。这在内部进行,对用户是透明的。
来源:pkg/config/load.go176-177 pkg/config/load.go208-214
frp客户端配置支持使用includes指令包含其他配置文件。这允许将配置分割成多个文件
包含机制通过以下方式工作:
来源:pkg/config/load.go232-239 pkg/config/load.go264-300 pkg/config/legacy/client.go391-394
frp支持用于配置解析的严格模式,该模式不允许未知字段。这有助于捕获配置错误
严格模式有助于检测拼写错误和不正确的配置键,尤其是在从旧格式迁移到现代格式时。
来源:pkg/config/load.go106-112 pkg/config/load.go117-119 pkg/config/v1/common.go20-33
frp中的配置加载系统设计得既灵活又用户友好,支持多种格式、基于模板的配置,并保持与旧格式的向后兼容性。这允许用户选择最适合其需求的配置格式,同时确保从frp的旧版本顺利过渡。