在自建博客、API 网关和内部工具托管里,Caddy 正成为 Nginx 之外最受欢迎的现代化选择。它最大的杀手锏是默认自动申请并续期 HTTPS 证书——你只需写一份简洁的 Caddyfile,反向代理、静态托管、负载均衡就全配置好了,证书和 TLS 细节统统不用管。本文用可复制的命令,带你从安装到生产落地跑通 Caddy。
一、为什么是 Caddy:它和 Nginx 差在哪
Caddy 与 Nginx 都能做反向代理和静态托管,但设计哲学不同。Caddy 用 Go 写成,单二进制、无依赖;Nginx 生态成熟、模块丰富。对绝大多数中小型站点,Caddy 的”零配置 HTTPS”能省下大量运维心智。
| 对比项 | Caddy | Nginx |
|---|---|---|
| 自动 HTTPS | 默认开启,ACME 自动签发续期 | 需手动申请证书并配置 |
| 配置语法 | Caddyfile,声明式极简 | conf,指令多、学习曲线陡 |
| 进程模型 | 单二进制,无守护进程 | master/worker |
| 负载均衡 | 内置,配置简单 | 依赖 upstream 模块 |
| 热重载 | 原生 admin API | 需 reload 信号 |
| 适用人群 | 想省心的个人/小团队 | 追求极致可控与生态 |
二、一分钟装好 Caddy
Debian / Ubuntu 推荐用官方仓库安装,自动搞定 systemd 服务:
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 -y caddy
caddy version # 验证安装
没有 root 软件源的环境(如容器里),直接拉官方单文件二进制更省事:
curl -fsSL https://caddyserver.com/api/download?os=linux&arch=amd64 -o caddy
chmod +x caddy && sudo mv caddy /usr/local/bin/
caddy run # 前台运行,便于看实时日志
三、Caddyfile 语法三分钟上手
Caddyfile 是声明式结构:站点地址 + 一对花括号里的指令。最简站点直接返回字符串:
:80 {
respond "Hello Caddy"
}
反向代理只要一行 reverse_proxy,把外部请求转发到本地后端:
example.com {
reverse_proxy localhost:3000
}
四、实战一:静态站点 + 自动 HTTPS
把域名 A 记录指向服务器公网 IP,下面这份配置即可获得免费证书,无需任何 TLS 指令:
blog.fsdata.site {
root * /var/www/blog
file_server
encode gzip
}
Caddy 启动后会通过 ACME(Let’s Encrypt 或 ZeroSSL)完成 HTTP-01 挑战、自动签发并定时续期,HTTPS 默认开启。若你的服务器已在跑 Nginx 占用 80/443,可参考我们的 Nginx 反向代理实战 做端口错开或平滑迁移。
五、实战二:反向代理多个后端
多域名、多路径路由是 Caddy 的强项,一份文件就能编排清楚:
api.fsdata.site {
reverse_proxy localhost:8080
}
fsdata.site {
reverse_proxy /api/* localhost:9000
reverse_proxy localhost:5173
}
/api/* 精准前缀匹配让接口走后端服务,其余流量回源前端。关于证书与 TLS 握手层的原理,可延伸阅读我们的 SSL/TLS 配置指南。
六、实战三:负载均衡与健康检查
app.fsdata.site {
reverse_proxy 10.0.0.11:8000 10.0.0.12:8000 10.0.0.13:8000 {
lb_policy round_robin
health_uri /healthz
health_interval 10s
health_timeout 3s
}
}
Caddy 内置轮询、最少连接等负载策略,并周期性探活,自动摘除返回非 200 的节点,无需额外组件。
七、通配符证书与 DNS 插件
想要 *.fsdata.site 一张证书覆盖全部子域,需用 DNS-01 挑战。安装对应 DNS 插件(如 Cloudflare)后配置:
{
acme_dns cloudflare {env.CF_API_TOKEN}
}
*.fsdata.site {
reverse_proxy localhost:3000
}
八、生产落地建议
- 用
sudo systemctl enable --now caddy守护进程,别前台裸跑。 - 证书默认存
~/.local/share/caddy,务必备份,避免频繁签发触发 CA 限频。 - 改完 Caddyfile 执行
caddy reload热加载,连接不中断。 - 生产环境收敛 admin API:
admin 127.0.0.1:2019,别暴露到公网。 - SPA 用
try_files:rewrite * /index.html配合file_server避免刷新 404。
九、常见问题排查
证书申请失败:先确认 80 端口没被占用、域名 A 记录已解析到本机;用 caddy trusted 查看 CA 状态。
反向代理 502:确认后端 bind 到 0.0.0.0 而非仅 127.0.0.1,且进程在监听。
静态资源 404:检查 root * 路径是否存在、权限是否可读。
热加载不生效:caddy validate 先校验语法,再 caddy reload。




