适配器系统负责将 Caddyfile 配置转换为 Caddy 的内部 JSON 配置格式。该系统弥合了人类可读的 Caddyfile 语法与 Caddy 核心内部使用的结构化 JSON 配置之间的差距。
有关 Caddyfile 解析和词法分析的信息,请参阅解析和处理。有关单个 Caddyfile 指令的详细信息,请参阅指令。
适配器系统通过以下方式将 Caddyfile 服务器块转换为完整的 Caddy 配置:
caddyconfig/httpcaddyfile/httptype.go54中的ServerType结构体是协调整个转换过程的主要适配器实现。
适配器架构概述
来源:caddyconfig/httpcaddyfile/httptype.go57-363
caddyconfig/httpcaddyfile/httptype.go57-363中的Setup方法是适配过程的主要入口点。
Setup 方法流程
来源:caddyconfig/httpcaddyfile/httptype.go57-186
指令的注册使用两个主要函数,它们决定了指令如何处理配置
| 功能 | 目的 | 用途 |
|---|---|---|
RegisterDirective | 通用指令注册 | 返回多个 ConfigValue 对象 |
RegisterHandlerDirective | HTTP 处理程序注册 | 返回单个 MiddlewareHandler,自动包装在路由中 |
指令注册系统
来源:caddyconfig/httpcaddyfile/directives.go109-138
caddyconfig/httpcaddyfile/directives.go201-211中的Helper结构体提供了指令函数的实用工具。
caddyconfig/httpcaddyfile/directives.go420-435中的ConfigValue结构体代表了适配过程中的中间配置。
每个服务器块都会将 ConfigValue 对象按类别收集到一个“堆”中。
服务器块配置处理
来源:caddyconfig/httpcaddyfile/httptype.go76-172 和 caddyconfig/httpcaddyfile/directives.go536-540
HTTP 应用程序是根据 caddyconfig/httpcaddyfile/httptype.go531-986中处理的服务器块构建而成。
caddyhttp.Server 实例caddyconfig/httpcaddyfile/tlsapp.go36-535处理 TLS 配置生成。
TLS 应用程序构建过程
来源:caddyconfig/httpcaddyfile/tlsapp.go36-535
全局选项在服务器块之前进行处理,并影响整个配置
| 选项类别 | 示例 | 处理函数 |
|---|---|---|
| 网络 | http_port、https_port、default_bind | parseOptHTTPPort、parseOptHTTPSPort |
| TLS | acme_ca、email、cert_issuer | parseOptSingleString、parseOptCertIssuer |
| 管理员 | admin | parseOptAdmin |
| 存储 | storage | parseOptStorage |
来源:caddyconfig/httpcaddyfile/options.go32-68 和 caddyconfig/httpcaddyfile/httptype.go369-454
命名路由允许在多个位置重用指令
命名路由系统
来源:caddyconfig/httpcaddyfile/httptype.go456-529 和 caddyconfig/httpcaddyfile/builtins.go868-887
适配器按监听地址对服务器块进行分组,以创建高效的服务器配置
Address 对象来源:caddyconfig/httpcaddyfile/httptype.go174-186 和 caddyconfig/httpcaddyfile/addresses.go
核心指令在 caddyconfig/httpcaddyfile/builtins.go38-56中定义。
每个指令都有一个专用的解析函数,返回适当的 ConfigValue 对象。