1. 第一部分:Caddy 核心理念

 

1.1 Caddy 是什么?

Caddy 是一个用 Go 语言编写的、现代化的、高性能 Web 服务器。它被设计为“开箱即用”的,尤其是对于 HTTPS。

1.2 为什么选 Caddy?(核心优势)


 

2. 第二部分:安装与运行

2.1 安装

方式一:使用包管理器 (Linux 生产环境推荐)

这将自动把 Caddy 安装为一个 systemd 服务,这是在服务器上运行的最佳方式

方式二:使用 Docker (开发与容器化推荐)

(更多 Docker 细节请参见 6.5 节)

方式三:下载二进制文件

您可以从 Caddy 的 GitHub Releases 页面 下载适用于您系统的二进制文件,解压后即可使用。

2.2 验证安装

2.3 CLI 快速入门 (即时满足)

Caddy 的 CLI 非常强大,您甚至不需要 Caddyfile 就能完成很多事:


 

3. 第三部分:Caddy 的“心脏”:Caddyfile

Caddyfile 是配置 Caddy 的最常用方式。

3.1 Caddyfile 基础结构

3.2 Caddy 2 的核心概念:请求匹配 (Matchers)

这是 Caddy 2 与 Caddy 1 最大的区别,也是其强大的根源。Matcher (匹配器) 是一个过滤器,它决定了哪些请求应该被特定的指令处理。

Matcher 有三种定义方式:

  1. 匿名 Matcher (最常用): 直接跟在指令后面。

  2. 命名 Matcher ( @name ) (处理复杂逻辑):

    使用 @name 定义一个匹配器,然后在指令中引用它。

  3. 所有请求 (*) (默认):

    如果您不提供 Matcher,Caddy 默认使用 *,即“匹配所有请求”。

常用的 Matcher 类型:


 

4. 第四部分:核心功能与指令(参考手册)

4.1 静态文件服务 (file_server)

托管静态 HTML/CSS/JS 网站。

 

4.2 反向代理 (reverse_proxy)

将请求转发给后端的 Web 应用(Node, Python, Go, Java, PHP 等)。

基础用法:

负载均衡:

Caddy 原生支持负载均衡和健康检查。

转发请求头 (重要):

Caddy 默认会设置 Host, X-Forwarded-For, X-Forwarded-Proto 和 X-Forwarded-Host 头,这比 Nginx 智能。

4.3 自动 HTTPS 与 TLS 管理 (tls)

Caddy 默认对所有公网域名启用自动 HTTPS。

⚠️ 自动 HTTPS 的前提:

  1. Caddy 必须能通过公网 IP 访问。
  2. 域名的 A/AAAA 记录必须指向该公网 IP。
  3. 服务器的 80 和 443 端口必须对外开放(防火墙允许)。Caddy 会在 80 端口响应 ACME HTTP-01 质询,并在 443 端口提供 TLS 服务。

自定义 TLS 选项:

4.4 路由与请求匹配(Matchers)

如 3.2 节所述,Matcher 是路由的基石。

示例:try_files (Nginx 常用)

try_files 尝试按顺序查找文件,如果都找不到,则执行一个后备操作(通常是 index.php)。

在 Caddy 中,try_files 是 file_server 的一个选项。

示例:handleroute (高级路由)

4.5 URL 重定向 (redir)

4.6 日志 (log)

Caddy 默认开启结构化 (JSON) 日志,输出到 stderr (当使用 systemd 时,由 journald 捕获)。

4.7 HTTP 头管理 (header)

用于添加、修改或删除响应头

4.8 压缩 (encode)

启用 gzipzstd 压缩。

4.9 错误处理 (handle_errors)

为 4xx 或 5xx 错误提供自定义页面。

4.10 代码片段与导入 (snippet, import)

这是 Caddyfile 保持简洁的秘诀。

 

5. 第五部分:服务管理与运维

5.1 使用 Systemd (Linux 服务)

 

如果您通过 aptdnf 安装,Caddy 已被配置为 systemd 服务 (caddy.service)。

5.2 使用 CLI 命令

 

如果您是手动下载二进制文件:

5.3 优雅重载与验证

这是生产环境中的标准操作流程:

  1. 编辑 Caddyfile

  2. 验证 Caddyfile (防止配置错误导致服务中断)

  3. 应用配置


 

6. 第六部分:高级主题(程序员精通)

6.1 Caddy 的“真面目”:JSON 配置

Caddyfile 只是一个“适配器”。Caddy 进程真正运行的是 JSON 配置。

caddy adapt 命令可以向您展示 Caddyfile 被翻译成了什么:

Caddyfile:

会被翻译成 (简化版):

6.2 动态配置:Admin API

Caddy 默认在 localhost:2019 运行一个管理 API。这允许您在不重启/重载 Caddy 的情况下动态更改配置。

安全警告: Admin API 默认只监听本地回环地址 (localhost)。请勿将其暴露在公网,除非您配置了严格的防火墙或认证。

常用 API 操作 (curl):

 

6.3 解决配置漂移(Caddyfile vs API)

这是 Caddy 2 最常见的陷阱:

如果您使用 curl 通过 API 更新了配置,/etc/caddy/Caddyfile 文件不会自动更新。

此时,如果您(或其他人)运行了 caddy reload (或 systemctl reload caddy),Caddy 会重新读取 Caddyfile,导致您通过 API 所做的所有更改全部丢失。

解决方案:选择一种工作流并坚持下去!

6.4 使用 xcaddy 构建自定义插件

Caddy 的许多功能(例如 DNS 质询)都是插件。官方的 Caddy 二进制文件只包含标准插件。

如果您需要 DNS 插件(例如用于 Cloudflare 以获取通配符证书),您必须使用 xcaddy 重新编译 Caddy。

  1. 安装 go (Go 语言环境) 和 xcaddy:

    (确保 $HOME/go/bin 在您的 $PATH 中)

  2. 构建 Caddy (包含 Cloudflare 插件):

  3. 运行 xcaddy build

    这会在当前目录生成一个 caddy 二进制文件。用它替换您系统中的 Caddy (例如 /usr/bin/caddy),然后重启 Caddy 服务。

  4. 在 Caddyfile 中使用 DNS 质询:

6.5 在 Docker 中使用 Caddy

在 Docker 中运行 Caddy 是非常推荐的方式。

推荐的 docker-compose.yml 结构:

对应的 Caddyfile (./Caddyfile):

 

7. 第七部分:故障排查 (FAQ)