Caddy 简介 #
什么是 Caddy? #
Caddy 是一个强大的、企业级的、开源的 Web 服务器,具有自动 HTTPS 功能。它由 Matthew Holt 于 2015 年创建,使用 Go 语言编写,专为现代 Web 而设计。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ Caddy │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 自动 HTTPS │ │ 反向代理 │ │ 静态文件 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 负载均衡 │ │ API 网关 │ │ 动态配置 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
Caddy 的历史 #
发展历程 #
text
2015年 ─── Caddy 项目启动
│
│ Matthew Holt 创建
│ 首创自动 HTTPS 功能
│
2017年 ─── Caddy 1.0
│
│ 稳定版本发布
│ 社区快速增长
│
2020年 ─── Caddy 2.0
│
│ 完全重写架构
│ 更强大的配置系统
│ 原生 JSON 配置支持
│
2022年 ─── Caddy 2.6
│
│ 性能大幅提升
│ 更多内置功能
│
至今 ─── 持续更新
│
│ 活跃的社区
│ 丰富的插件生态
里程碑版本 #
| 版本 | 时间 | 重要特性 |
|---|---|---|
| 0.5 | 2015 | 首个公开版本 |
| 0.8 | 2016 | HTTP/2 支持 |
| 1.0 | 2017 | 稳定版本发布 |
| 2.0 | 2020 | 完全重写,JSON 配置 |
| 2.1 | 2020 | 改进的 API |
| 2.4 | 2021 | 原生 Cloudflare DNS 支持 |
| 2.5 | 2022 | 改进的日志系统 |
| 2.6 | 2022 | 性能优化 |
为什么选择 Caddy? #
传统 Web 服务器的痛点 #
在没有 Caddy 之前,配置 HTTPS 需要以下步骤:
bash
# 传统方式配置 HTTPS
# 1. 安装 Certbot
sudo apt install certbot
# 2. 获取证书
sudo certbot certonly --standalone -d example.com
# 3. 配置 Nginx
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# ... 更多 SSL 配置
}
# 4. 设置自动续期
sudo crontab -e
# 添加定时任务
0 0 1 * * certbot renew --quiet
Caddy 的解决方案 #
caddyfile
# Caddyfile - 只需一行!
example.com
# 就这么简单!Caddy 会自动:
# - 获取 Let's Encrypt 证书
# - 配置 HTTPS
# - 设置 HTTP 到 HTTPS 重定向
# - 自动续期
Caddy 的核心特点 #
1. 自动 HTTPS #
Caddy 最显著的特点是自动 HTTPS:
caddyfile
# 自动获取证书
example.com {
respond "Hello, HTTPS!"
}
# 多域名自动证书
app1.example.com, app2.example.com {
respond "Multiple domains!"
}
2. 简洁的配置语法 #
Caddyfile 语法直观易懂:
caddyfile
example.com {
# 静态文件服务
root * /var/www/html
file_server
# 反向代理
reverse_proxy localhost:3000
# 日志
log {
output file /var/log/caddy/access.log
}
}
3. 零停机重载 #
配置更改无需停止服务:
bash
# 平滑重载配置
caddy reload --config Caddyfile
# 服务不会中断
# 新连接使用新配置
# 旧连接继续处理
4. 内置安全最佳实践 #
Caddy 默认启用安全配置:
text
┌─────────────────────────────────────────────────────────────┐
│ Caddy 默认安全配置 │
├─────────────────────────────────────────────────────────────┤
│ ✅ TLS 1.2/1.3 │
│ ✅ 强加密套件 │
│ ✅ HSTS 头 │
│ ✅ OCSP Stapling │
│ ✅ HTTP/2 和 HTTP/3 │
│ ✅ 自动证书续期 │
└─────────────────────────────────────────────────────────────┘
5. 动态配置 API #
通过 API 实时修改配置:
bash
# 获取当前配置
curl localhost:2019/config/
# 动态添加站点
curl -X POST localhost:2019/config/apps/http/servers/srv0/routes \
-H "Content-Type: application/json" \
-d '{"match":[{"host":["new.example.com"]}],"handle":[{"handler":"static_response","body":"Hello!"}]}'
6. 高性能 #
使用 Go 语言编写,性能优异:
text
┌─────────────────────────────────────────────────────────────┐
│ Caddy 性能特点 │
├─────────────────────────────────────────────────────────────┤
│ 🚀 单二进制文件,无依赖 │
│ 🚀 高效的事件驱动架构 │
│ 🚀 智能连接池管理 │
│ 🚀 内存占用低 │
│ 🚀 并发处理能力强 │
└─────────────────────────────────────────────────────────────┘
Caddy 与其他 Web 服务器对比 #
Caddy vs Nginx #
| 特性 | Caddy | Nginx |
|---|---|---|
| 自动 HTTPS | ✅ 内置 | ❌ 需 Certbot |
| 配置语法 | ✅ 简单直观 | ⚠️ 较复杂 |
| 性能 | ✅ 高 | ✅ 极高 |
| 学习曲线 | ✅ 平缓 | ⚠️ 较陡 |
| 动态配置 | ✅ 原生 API | ⚠️ 需 OpenResty |
| 社区生态 | 🔄 发展中 | ✅ 成熟 |
Caddy vs Apache #
| 特性 | Caddy | Apache |
|---|---|---|
| 自动 HTTPS | ✅ 内置 | ❌ 需手动 |
| 配置语法 | ✅ 简洁 | ⚠️ 复杂 |
| 性能 | ✅ 高 | ⚠️ 中等 |
| 内存占用 | ✅ 低 | ⚠️ 较高 |
| 模块化 | ✅ 插件 | ✅ 模块 |
Caddy vs Traefik #
| 特性 | Caddy | Traefik |
|---|---|---|
| 自动 HTTPS | ✅ | ✅ |
| 配置方式 | Caddyfile/JSON | Labels/YAML |
| 容器集成 | ✅ 良好 | ✅ 原生 |
| 学习曲线 | ✅ 简单 | ⚠️ 中等 |
| 静态文件 | ✅ 内置 | ❌ 需配置 |
Caddy 的应用场景 #
1. 静态网站托管 #
caddyfile
example.com {
root * /var/www/html
file_server
encode gzip
}
2. 反向代理 #
caddyfile
api.example.com {
reverse_proxy localhost:3000
}
app.example.com {
reverse_proxy localhost:8080
}
3. 负载均衡 #
caddyfile
app.example.com {
reverse_proxy {
to localhost:3000
to localhost:3001
to localhost:3002
lb_policy round_robin
}
}
4. API 网关 #
caddyfile
api.example.com {
# 认证
basicauth {
user JDJhJDEwJEVCNmdaNEg2Ti5iejRBNWd3U2JtZS9tZy4wbXpXLlF2SjRXTU9wSjZPUW
}
# 路由
handle /api/users/* {
reverse_proxy localhost:3001
}
handle /api/orders/* {
reverse_proxy localhost:3002
}
}
5. 开发环境 #
caddyfile
# 本地开发 HTTPS
localhost {
reverse_proxy localhost:3000
tls internal
}
# 开发域名
dev.example.com {
reverse_proxy localhost:3000
}
Caddy 的核心概念 #
Caddyfile #
Caddyfile 是 Caddy 的配置文件,使用简洁的 DSL 语法:
caddyfile
# 站点地址
example.com {
# 指令
root * /var/www/html
file_server
}
指令(Directives) #
指令是 Caddyfile 的核心组成部分:
caddyfile
example.com {
# 常用指令
root * /var/www/html # 设置根目录
file_server # 静态文件服务
reverse_proxy localhost:3000 # 反向代理
encode gzip # 压缩
log # 日志
basicauth # 基础认证
}
匹配器(Matchers) #
匹配器用于精确控制请求匹配:
caddyfile
example.com {
# 路径匹配
handle /api/* {
reverse_proxy localhost:3000
}
# 文件扩展名匹配
@static {
path *.css *.js *.png
}
header @static Cache-Control "public, max-age=31536000"
# 方法匹配
@post {
method POST
}
respond @post "Method not allowed" 405
}
配置适配器 #
Caddy 支持多种配置格式:
| 格式 | 适配器 | 说明 |
|---|---|---|
| Caddyfile | caddyfile | 默认格式,简洁易读 |
| JSON | json | 原生格式,完整功能 |
| YAML | yaml | 需要 yaml 适配器 |
| TOML | toml | 需要 toml 适配器 |
Caddy 的架构 #
整体架构 #
text
┌─────────────────────────────────────────────────────────────┐
│ Caddy 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Caddyfile │ │ JSON │ │ API │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 配置适配器 │ │
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 核心配置结构 │ │
│ └────────┬────────┘ │
│ ▼ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ 应用层 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ HTTP │ │ TLS │ │ DNS │ │ Storage │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
HTTP 处理流程 #
text
请求 → TLS 握手 → 路由匹配 → 处理器链 → 响应
│ │ │
▼ ▼ ▼
自动证书 匹配器 指令执行
学习路径 #
text
入门阶段
├── 安装与配置
├── 编写第一个 Caddyfile
├── 静态文件服务
└── 反向代理配置
进阶阶段
├── HTTPS 配置
├── 负载均衡
├── 访问控制
└── 日志管理
高级阶段
├── API 动态配置
├── 插件开发
├── 性能优化
└── 故障排查
实战阶段
├── Docker 部署
├── 生产环境配置
├── 多站点管理
└── 最佳实践
下一步 #
现在你已经了解了 Caddy 的基本概念,接下来学习 安装配置 开始实际使用 Caddy!
最后更新:2026-03-28