Caddy 深度拆解:Go 写的 Web 服务器,自动 HTTPS 两行配置
来源:微信公众号
Caddy:56K Star,Go 写的 Web 服务器,Apache-2.0 协议。核心卖点——配置简单到令人发指,HTTPS 自动搞定。
为什么需要 Caddy
HTTPS 证书管理是 Web 服务器的常见痛点。用 Let's Encrypt 申请证书,90 天过期,要写 cron 任务自动续期。脚本挂了没人发现,直到用户投诉"网站打不开",才发现证书过期了。
Caddy 的思路:配置一行 example.com,自动申请证书,自动续期。从此不用管证书的事。
Caddy 是什么
| 项目信息 | 详情 |
|---|---|
| GitHub | github.com/caddyserver/caddy |
| Star | 56K+ |
| 语言 | Go |
| 协议 | Apache-2.0 |
| 定位 | Web 服务器 / 反向代理 |
| 特色 | 自动 HTTPS、配置简单 |
| 安装 | 二进制 / Docker / 包管理器 |
Caddy 最早是 Matt Holt 在 2015 年做的。他在做 Web 开发时,发现 NGINX 配置复杂,HTTPS 证书管理麻烦,就写了 Caddy。名字"球童"——高尔夫球童帮你拿球杆,Caddy 帮你搞定 Web 服务的琐事。
Caddyfile:配置有多简单
静态文件服务:
localhost:8080 {
file_server browse
}
反向代理:
example.com {
reverse_proxy localhost:8080
}
两行。HTTPS 自动搞定。
负载均衡:
example.com {
reverse_proxy {
to localhost:8080 localhost:8081 localhost:8082
}
}
多站点:
example.com {
reverse_proxy localhost:8080
}
api.example.com {
reverse_proxy localhost:9090
}
对比 NGINX:NGINX 配置文件长、语法复杂。Caddyfile 短、语法简单。
自动 HTTPS:Let's Encrypt 集成
当你在 Caddyfile 里写 example.com,Caddy 会:
- 向 Let's Encrypt 申请证书
- 配置 HTTPS(自动重定向 HTTP 到 HTTPS)
- 定期续期证书(证书过期前自动续期)
你不用管证书怎么申请、怎么续期。Caddy 全自动。
内部 HTTPS(自签名证书):
https://internal.example.com {
tls internal
reverse_proxy localhost:8080
}
tls internal 告诉 Caddy:用自签名证书。Caddy 自动生成根证书,自动配置 TLS。
反向代理和负载均衡
WebSocket 代理:Caddy 自动支持 WebSocket,不用额外配置。
健康检查:
example.com {
reverse_proxy {
to localhost:8080 localhost:8081
health_uri /health
health_interval 10s
}
}
Caddy 定期检查后端的 /health 端点,如果不健康,停止转发请求。
重试:
example.com {
reverse_proxy {
to localhost:8080 localhost:8081
fail_duration 10s
max_fails 3
}
}
后端失败了,Caddy 自动重试。
插件系统
Caddy 有插件系统。插件可以扩展功能:
caddy-cloudflare:Cloudflare DNS 验证caddy-security:认证、授权caddy-ratelimit:限流caddy-cache:缓存
安装插件:
xcaddy build --with github.com/caddy-dns/cloudflare
xcaddy 是 Caddy 的构建工具,把插件编译进 Caddy。
跟其他方案对比
| 维度 | Caddy | NGINX | Traefik | HAProxy |
|---|---|---|---|---|
| 语言 | Go | C | Go | C |
| 配置 | Caddyfile(简单) | nginx.conf(复杂) | 动态(K8s/Docker) | haproxy.cfg(复杂) |
| HTTPS | 自动 | 手动 | 自动(Let's Encrypt) | 手动 |
| 反向代理 | 有 | 有 | 有 | 有 |
| 负载均衡 | 有 | 有 | 有 | 有 |
| Web UI | 有(API) | 无 | 有 | 无 |
| 学习成本 | 低 | 中 | 中 | 中 |
Caddy 配置最简单、HTTPS 自动、学习成本最低。
Go 代码赏析
Caddy 的代码结构清晰。几个核心包:
| 包 | 功能 |
|---|---|
cmd/caddy/ | Caddy 主进程入口 |
caddyconfig/ | Caddyfile 解析 |
modules/caddyhttp/ | HTTP 模块(反向代理、文件服务) |
modules/caddytls/ | TLS 模块(自动 HTTPS) |
modules/caddypki/ | PKI 模块(内部 CA) |
admin/ | 管理 API |
代码风格是标准的 Go。函数短小,命名清晰。错误处理显式。
不足
- 性能不如 NGINX:Caddy 是 Go 写的,NGINX 是 C 写的。大规模高并发场景,NGINX 性能更好。
- 功能不如 NGINX 全:NGINX 有很多高级功能——复杂的 rewrite 规则、精细的缓存策略、各种 filter。Caddy 的功能相对简单。
- 插件生态有限:NGINX 的模块生态庞大,社区活跃。Caddy 的插件少很多。
- 升级有坑:跨版本升级有时不兼容,特别是 Caddyfile 语法变化。
- 内存占用高:Go 的 goroutine 有内存开销,Caddy 的内存占用比 NGINX 高。
适用场景
- 个人项目:跑个人博客、个人项目?Caddy 一行配置搞定 HTTPS。
- 小团队:没有专职运维,不想在 Web 服务器上花时间?Caddy 配置简单,自动 HTTPS,让你专注业务。
- API 网关:要跑 API 服务,需要反向代理、负载均衡?Caddy 几行配置就能搭起来。
- 静态文件服务:
file_server一条指令,目录浏览都给你开了。 - 本地开发 HTTPS:
tls internal自动生成自签名证书。
总结
NGINX 配置复杂,HTTPS 证书要手动申请、手动续期。Caddy 换了个思路:配置简单到令人发指,HTTPS 全自动。两行配置,跑起来一个 HTTPS 站点。证书申请、续期,都不用你管。
如果你的项目还在用 NGINX,被复杂配置和证书管理折磨,花一天看看 Caddy。可能会让你重新认识 Web 服务器。
GitHub:https://github.com/caddyserver/caddy
官网:https://caddyserver.com/docs