Caddy

深入

架构

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 实例指向同一份存储时,会自动共享证书并协调续期,避免重复签发与竞态。这让横向扩容时证书管理不再是问题。