引言
"Every site on HTTPS"
这是「一天一个开源项目」系列的第 46 篇文章。今天介绍的项目是 Caddy (GitHub)。
还在为配置 HTTPS 证书而烦恼?还在使用 Nginx 或 Apache 的复杂配置?Caddy 是一个用 Go 编写的快速、可扩展的多平台 Web 服务器 ,默认自动 HTTPS ,支持 HTTP/1.1、HTTP/2、HTTP/3 ,零配置即可使用,适合生产环境。自 2014 年发布以来,已服务数万亿 HTTPS 请求 ,管理数百万 TLS 证书,是第一个默认使用 HTTPS 的 Web 服务器。
为什么值得看?
- 🚀 自动 HTTPS:默认启用,自动管理 TLS 证书(Let's Encrypt、ZeroSSL)
- 🌐 HTTP/3 支持:默认支持 HTTP/1.1、HTTP/2、HTTP/3
- ⚡ 高性能:Go 编写,单二进制文件,无外部依赖
- 🔧 易配置:Caddyfile 简单配置,JSON API 动态配置
- 🛡️ 生产就绪:已服务数万亿请求,管理数百万证书
- 🔌 高度可扩展:模块化架构,丰富的插件生态
- 📦 零依赖:单静态二进制文件,甚至不需要 libc
你将学到什么
- Caddy 的核心特性:自动 HTTPS、HTTP/3、反向代理
- Caddyfile 配置语法和 JSON API 配置
- 与 Nginx、Apache 的对比和优势
- 实际使用场景:静态网站、反向代理、API 网关
- 插件系统和扩展机制
- 生产环境部署最佳实践
前置知识
- 了解 Web 服务器基本概念(HTTP、HTTPS、反向代理)
- 对 TLS/SSL 证书有基本了解
- 了解 Go 语言(可选,用于理解实现)
- 对 Nginx 或 Apache 有使用经验(可选,便于对比)
项目背景
项目简介
Caddy 是一个用 Go 编写的快速、可扩展的多平台 Web 服务器 ,最突出的特点是默认自动 HTTPS。它是第一个默认使用 HTTPS 的 Web 服务器,让 HTTPS 成为标准而非选项。
核心特点:
- 自动 HTTPS:默认启用,自动从 Let's Encrypt 或 ZeroSSL 获取证书
- HTTP/3 支持:默认支持 HTTP/1.1、HTTP/2、HTTP/3
- 零配置:最简单的配置即可运行
- 高性能:Go 编写,单二进制文件,无外部依赖
- 生产就绪:已服务数万亿请求,管理数百万证书
- 高度可扩展:模块化架构,丰富的插件生态
- 动态配置:支持 JSON API 在线配置更改
- 多平台:支持 Linux、macOS、Windows
解决的核心问题:
- HTTPS 配置复杂,证书管理繁琐
- 传统 Web 服务器配置复杂,学习曲线陡峭
- HTTP/3 支持需要额外配置
- 证书过期导致服务中断
- 多站点管理复杂
面向的用户:
- 需要快速部署 HTTPS 网站的开发者
- 需要简化 Web 服务器配置的运维人员
- 需要 HTTP/3 支持的应用
- 需要反向代理和负载均衡的团队
- 希望零配置使用 HTTPS 的个人开发者
作者/团队介绍
- 作者 :Matthew Holt (@mholt6)
- 背景:2014 年在杨百翰大学学习计算机科学时开始开发 Caddy
- 理念:让 HTTPS 成为标准,简化 Web 服务器配置
- 项目归属:ZeroSSL(HID Global 公司)的项目
- 社区:数百名贡献者,活跃的社区支持
项目名称由来: "Caddy" 这个名字的由来是因为这个软件帮助处理 Web 服务的繁琐、平凡任务,也是多个东西组织在一起的单一场所(就像高尔夫球童 caddy 一样)。
项目数据
- ⭐ GitHub Stars: 70.8k+
- 🍴 Forks: 4.7k+
- 📦 版本: v2.11.2(持续更新中,2,505+ commits)
- 📄 License: Apache-2.0
- 🌐 官网 : caddyserver.com
- 📚 文档 : caddyserver.com/docs
- 💬 社区 : caddy.community
- 🐛 Issues : GitHub Issues
技术栈:
- 语言: Go(97.9%)
- 核心特性: HTTP/1.1、HTTP/2、HTTP/3、TLS、自动证书管理
- 依赖: CertMagic(自动证书管理库)
- 平台: Linux、macOS、Windows
重要里程碑:
- 2014 年:项目启动,第一个默认 HTTPS 的 Web 服务器
- 2020 年:Caddy 2.0 发布,完全重写
- 2021 年:Caddy 2.6 默认启用 HTTP/3
- 至今:已服务数万亿 HTTPS 请求,管理数百万证书
主要功能
核心作用
Caddy 的核心作用是:提供一个现代化、易用的 Web 服务器,让开发者能够:
- 零配置 HTTPS:自动获取和管理 TLS 证书
- 高性能服务:支持 HTTP/1.1、HTTP/2、HTTP/3
- 反向代理:灵活的反向代理和负载均衡
- 静态文件服务:高效的静态文件服务器
- 动态配置:通过 JSON API 在线更改配置
- 多站点管理:轻松管理数百个站点
- 插件扩展:丰富的插件生态
使用场景
-
静态网站托管
- 个人博客、文档网站
- 单页应用(SPA)部署
- 静态资源 CDN
-
反向代理
- 微服务 API 网关
- 负载均衡
- 服务发现集成
-
开发环境
- 本地 HTTPS 开发
- 自动证书管理
- 快速原型部署
-
生产环境
- 高可用 Web 服务
- 多站点管理
- 自动证书续期
-
容器化部署
- Docker 容器
- Kubernetes Ingress
- 云原生应用
快速开始
安装:
bash
# macOS
brew install caddy
# Linux(使用包管理器)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
# 或直接下载二进制文件
wget https://github.com/caddyserver/caddy/releases/latest/download/caddy_2.11.2_linux_amd64.tar.gz
tar -xzf caddy_2.11.2_linux_amd64.tar.gz
sudo mv caddy /usr/local/bin/
最简单的配置(Caddyfile):
caddyfile
# 自动 HTTPS,零配置
localhost
respond "Hello, Caddy!"
运行:
bash
# 使用 Caddyfile
caddy run
# 或指定配置文件
caddy run --config Caddyfile
# 后台运行
caddy start --config Caddyfile
访问:
- HTTP: http://localhost:2015
- HTTPS: https://localhost(自动证书)
反向代理示例:
caddyfile
example.com {
reverse_proxy localhost:8080
}
静态文件服务:
caddyfile
example.com {
root * /var/www/html
file_server
}
核心特性
-
自动 HTTPS
- 默认启用 HTTPS
- 自动从 Let's Encrypt 或 ZeroSSL 获取证书
- 自动续期,无需手动管理
- 支持内部名称和 IP 的本地 CA
- 多证书颁发机构回退
-
HTTP/3 支持
- 默认支持 HTTP/1.1、HTTP/2、HTTP/3
- 基于 QUIC 协议
- 自动降级(UDP 不可用时回退到 HTTP/2)
- 向后兼容
-
灵活的配置
- Caddyfile:简单易读的配置语法
- JSON API:原生 JSON 配置,动态更新
- 配置适配器:支持 YAML、TOML、NGINX 配置格式
- 在线配置更改:无需重启,优雅重载
-
反向代理
- 灵活的路由规则
- 负载均衡(轮询、最少连接、IP 哈希等)
- 健康检查
- 服务发现集成(Consul、Kubernetes 等)
- WebSocket 支持
-
静态文件服务
- 高效的文件服务器
- 目录浏览
- 文件压缩(gzip、brotli)
- 缓存控制
- 范围请求支持
-
安全特性
- TLS 1.3 支持
- OCSP Stapling
- HSTS 支持
- 安全头部自动设置
- 防止 TLS/OCSP/证书相关问题导致服务中断
-
可扩展性
- 模块化架构
- 丰富的插件生态
- 自定义中间件
- 插件热加载
-
生产就绪
- 已服务数万亿请求
- 管理数百万证书
- 支持数十万站点
- 高可用性设计
- 完善的监控和日志
项目优势
| 对比项 | Caddy | Nginx | Apache |
|---|---|---|---|
| HTTPS 配置 | ✅ 自动,零配置 | ⚠️ 需手动配置证书 | ⚠️ 需手动配置证书 |
| HTTP/3 支持 | ✅ 默认启用 | ⚠️ 需额外模块 | ⚠️ 需额外模块 |
| 配置复杂度 | ✅ Caddyfile 简单 | ⚠️ 配置文件复杂 | ⚠️ 配置文件复杂 |
| 动态配置 | ✅ JSON API,无需重启 | ⚠️ 需重载配置 | ⚠️ 需重载配置 |
| 证书管理 | ✅ 自动续期 | ❌ 需手动管理 | ❌ 需手动管理 |
| 性能 | ✅ Go 编写,高性能 | ✅ C 编写,高性能 | ⚠️ 进程模型,性能一般 |
| 内存安全 | ✅ Go 内存安全保证 | ⚠️ C 语言,需注意 | ⚠️ C 语言,需注意 |
| 依赖 | ✅ 单二进制,无依赖 | ⚠️ 需系统库 | ⚠️ 需系统库 |
| 学习曲线 | ✅ 简单,快速上手 | ⚠️ 陡峭 | ⚠️ 陡峭 |
| 插件生态 | ✅ 丰富的插件 | ✅ 丰富的模块 | ✅ 丰富的模块 |
为什么选择 Caddy?
- 零配置 HTTPS:自动获取和管理证书,无需手动操作
- 现代化协议:默认支持 HTTP/3,面向未来
- 简单配置:Caddyfile 语法简单,JSON API 灵活
- 生产就绪:已服务数万亿请求,管理数百万证书
- 高度可扩展:模块化架构,丰富的插件生态
- 单二进制:无外部依赖,易于部署
- 内存安全:Go 语言编写,内存安全保证
项目详细剖析
架构设计
Caddy 采用模块化、可扩展的架构设计,基于 Go 语言,通过模块系统实现功能扩展。
核心组件:
javascript
Caddy
├── HTTP App(HTTP 服务器)
│ ├── HTTP/1.1 支持
│ ├── HTTP/2 支持
│ └── HTTP/3 支持(QUIC)
├── TLS App(TLS 管理)
│ ├── 自动证书获取(CertMagic)
│ ├── 证书续期
│ └── OCSP Stapling
├── 反向代理模块
│ ├── 路由规则
│ ├── 负载均衡
│ └── 健康检查
├── 静态文件服务器
├── 中间件系统
│ ├── 认证
│ ├── 压缩
│ ├── 日志
│ └── 缓存
└── 配置系统
├── Caddyfile 解析器
├── JSON API
└── 配置适配器
设计理念:
- 默认安全:HTTPS 默认启用,安全优先
- 零配置:最简单的配置即可运行
- 模块化:功能通过模块实现,易于扩展
- 动态配置:支持在线配置更改,无需重启
- 单二进制:无外部依赖,易于部署
自动 HTTPS 实现
Caddy 的自动 HTTPS 功能基于 CertMagic 库实现,支持多种证书颁发机构。
工作流程:
markdown
1. 首次请求 HTTPS
↓
2. 检查本地是否有有效证书
↓
3. 如果没有,向 Let's Encrypt 或 ZeroSSL 申请
↓
4. 完成 ACME 挑战(HTTP-01、DNS-01、TLS-ALPN-01)
↓
5. 获取证书并存储
↓
6. 自动续期(证书到期前 30 天)
支持的证书颁发机构:
- Let's Encrypt:公开域名
- ZeroSSL:公开域名
- 本地 CA:内部名称和 IP
- 自定义 CA:支持自定义证书颁发机构
ACME 挑战类型:
- HTTP-01:通过 HTTP 验证域名所有权
- DNS-01:通过 DNS 记录验证
- TLS-ALPN-01:通过 TLS 握手验证
配置示例:
caddyfile
# 自动 HTTPS(默认)
example.com {
respond "Hello, HTTPS!"
}
# 使用特定邮箱(Let's Encrypt)
example.com {
email admin@example.com
respond "Hello, HTTPS!"
}
# 禁用自动 HTTPS
example.com {
http_only
respond "Hello, HTTP!"
}
HTTP/3 支持
Caddy 2.6+ 默认启用 HTTP/3 支持,基于 QUIC 协议。
HTTP/3 特性:
- 基于 QUIC:使用 UDP 传输,而非 TCP
- 多路复用:无队头阻塞
- 连接迁移:IP 地址变化时保持连接
- 0-RTT:快速建立连接
自动降级:
scss
HTTP/3 (QUIC/UDP)
↓ (UDP 不可用)
HTTP/2 (TCP)
↓ (HTTP/2 不可用)
HTTP/1.1 (TCP)
配置:
caddyfile
# HTTP/3 默认启用,无需配置
example.com {
respond "Hello, HTTP/3!"
}
# 显式启用 HTTP/3
example.com {
protocols h1 h2 h3
respond "Hello, HTTP/3!"
}
# 禁用 HTTP/3
example.com {
protocols h1 h2
respond "Hello, HTTP/2!"
}
配置系统
Caddy 支持多种配置方式,从简单的 Caddyfile 到灵活的 JSON API。
Caddyfile 语法:
caddyfile
# 全局选项
{
email admin@example.com
admin localhost:2019
}
# 站点配置
example.com {
# 反向代理
reverse_proxy localhost:8080
# 静态文件
root * /var/www/html
file_server
# 日志
log {
output file /var/log/caddy/access.log
}
# 压缩
encode gzip zstd
# 安全头部
header {
Strict-Transport-Security "max-age=31536000;"
X-Content-Type-Options "nosniff"
}
}
JSON API 配置:
json
{
"apps": {
"http": {
"servers": {
"srv0": {
"listen": [":443"],
"routes": [
{
"match": [
{
"host": ["example.com"]
}
],
"handle": [
{
"handler": "reverse_proxy",
"upstreams": [
{
"dial": "localhost:8080"
}
]
}
]
}
]
}
}
},
"tls": {
"automation": {
"policies": [
{
"subjects": ["example.com"],
"issuers": [
{
"module": "acme",
"email": "admin@example.com"
}
]
}
]
}
}
}
}
动态配置:
bash
# 通过 API 加载配置
curl -X POST http://localhost:2019/load \
-H "Content-Type: application/json" \
-d @config.json
# 获取当前配置
curl http://localhost:2019/config/
# 更新配置
curl -X PATCH http://localhost:2019/config/ \
-H "Content-Type: application/json" \
-d '{"apps":{"http":{"servers":{"srv0":{"listen":[":443"]}}}}}'
反向代理功能
Caddy 的反向代理功能非常强大,支持负载均衡、健康检查、服务发现等。
基本反向代理:
caddyfile
example.com {
reverse_proxy localhost:8080
}
负载均衡:
caddyfile
example.com {
reverse_proxy localhost:8080 localhost:8081 localhost:8082 {
# 负载均衡策略
lb_policy least_conn # 最少连接
# lb_policy round_robin # 轮询(默认)
# lb_policy ip_hash # IP 哈希
# lb_policy first # 第一个可用
# 健康检查
health_uri /health
health_interval 10s
health_timeout 5s
# 故障转移
fail_duration 30s
max_fails 3
unhealthy_status 500 502 503
}
}
WebSocket 支持:
caddyfile
example.com {
reverse_proxy /ws localhost:8080 {
# WebSocket 升级
header_up Connection "Upgrade"
header_up Upgrade "websocket"
}
}
服务发现:
caddyfile
example.com {
reverse_proxy consul://service-name
# 或
reverse_proxy kubernetes://service-name:8080
}
插件系统
Caddy 的插件系统非常灵活,可以通过模块扩展功能。
内置模块:
http:HTTP 服务器tls:TLS 管理reverse_proxy:反向代理file_server:静态文件服务器encode:压缩log:日志header:HTTP 头部操作
第三方插件:
caddy-dns/cloudflare:Cloudflare DNS 挑战caddy-dns/route53:AWS Route53 DNS 挑战caddy-auth-portal:认证门户caddy-rate-limit:速率限制caddy-cache:HTTP 缓存
使用插件:
bash
# 使用 xcaddy 构建带插件的 Caddy
xcaddy build \
--with github.com/caddy-dns/cloudflare \
--with github.com/mholt/caddy-ratelimit
性能优化
Caddy 的性能优化主要体现在:
- Go 语言优势:编译型语言,性能接近 C
- 单二进制:无外部依赖,启动快速
- 并发模型:Go 的 goroutine 实现高并发
- 内存管理:Go 的 GC 自动管理内存
- 零拷贝:减少数据拷贝,提高性能
性能对比(参考数据):
- 吞吐量:与 Nginx 相当
- 内存占用:略高于 Nginx,但可接受
- CPU 使用:与 Nginx 相当
- 启动时间:比 Nginx 快
项目地址与资源
官方资源
- 🌟 GitHub : github.com/caddyserver...
- 📚 文档 : caddyserver.com/docs
- 💬 社区论坛 : caddy.community
- 🐛 Issue Tracker : GitHub Issues
- 📦 下载 : GitHub Releases
- 🌐 官网 : caddyserver.com
相关资源
- CertMagic :自动证书管理库 - github.com/caddiliciou...
- xcaddy :Caddy 构建工具 - github.com/caddyserver...
- Caddy 插件列表 :caddyserver.com/docs/module...
- Caddyfile 语法 :caddyserver.com/docs/caddyf...
- JSON API 文档 :caddyserver.com/docs/api
适用人群
- Web 开发者:需要快速部署 HTTPS 网站
- 运维工程师:需要简化 Web 服务器配置
- DevOps 工程师:需要现代化的反向代理和负载均衡
- 个人开发者:需要零配置 HTTPS 开发环境
- 企业团队:需要生产级 Web 服务器,支持多站点管理
欢迎来我中的个人主页找到更多有用的知识和有趣的产品