菜单

配置加载

相关源文件

本文档介绍了frp如何加载和处理不同格式的配置文件,包括模板渲染、环境变量替换和旧格式兼容性。有关特定配置选项的信息,请参阅服务器配置客户端配置

概述

frp提供了一个灵活的配置系统,支持多种文件格式、基于模板的配置生成以及现代和旧配置格式的无缝处理。配置加载系统处理

  1. 加载各种格式(YAML、JSON、TOML)的配置文件
  2. 处理带有变量替换的模板
  3. 将旧的INI配置转换为新格式
  4. 验证配置值
  5. 从包含的文件加载其他配置

支持的配置格式

frp支持多种配置格式

格式描述文件扩展名
YAML现代配置的默认格式.yaml, .yml
JSON具有更严格语法的替代格式.json
TOML现代配置的替代格式.toml
INI旧格式(为向后兼容仍受支持).ini

来源:pkg/config/load.go113-142

配置加载过程

配置加载过程遵循一系列步骤来解析、验证和准备配置供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指令包含其他配置文件。这允许将配置分割成多个文件

包含机制通过以下方式工作:

  1. 从主配置读取包含模式
  2. 解析模式到实际文件路径
  3. 加载每个文件
  4. 合并配置

来源: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的旧版本顺利过渡。