深入
架构
Caddy 不只是 Web 服务器,它是一个运行长期 Go 程序的平台。
Caddy 最常被当作 HTTPS 服务器或反向代理,但它真正是「服务器的服务器」:一个可以承载任何长期运行 Go 程序的平台。Caddy 的「应用」就是以模块形式实现的 Go 程序。
从配置到运行
一条配置从写下来到真正接管流量,会经过这几步:
Caddyfile
|
| caddy adapt(配置适配器)
v
JSON 配置文档
|
| 管理 API /load
v
内存中的模块实例
|
v
正在工作的服务器注意第三步:Caddy 并不是「读一个文件然后按它做事」,而是把配置实例化成真正的 Go 类型值。你在配置里设置的是内存中已初始化类型的实际值,这些值驱动着从 HTTP 处理器、TLS 握手到存储介质的一切。
模块化
Caddy 的几乎每个部分都是模块。这意味着它可以在不臃肿的前提下做任何事:不需要的功能不编译进来,需要的功能写成一个模块插进去。
| 层次 | 例子 |
|---|---|
| 应用 | http、tls、pki、event |
| HTTP 处理器 | file_server、reverse_proxy |
| 请求匹配器 | host、path、expression |
| 证书签发者 | acme、internal |
| 存储介质 | file_system,也可以是数据库或对象存储 |
| 日志编码器 | json、console |
模块有全局唯一的名字,按命名空间组织,详见模块一篇。
优雅重载
配置变更不会重启进程。新配置先构建、先启动,旧配置随后停掉,中间只有极短的重叠窗口。这也意味着正在处理中的连接不会被硬生生切断。
集群协同
多个 Caddy 实例指向同一份存储时,会自动共享证书并协调续期,避免重复签发与竞态。这让横向扩容时证书管理不再是问题。