Caddy 实战:自动 HTTPS 的现代 Web 服务器与反向代理

在自建博客、API 网关和内部工具托管里,Caddy 正成为 Nginx 之外最受欢迎的现代化选择。它最大的杀手锏是默认自动申请并续期 HTTPS 证书——你只需写一份简洁的 Caddyfile,反向代理、静态托管、负载均衡就全配置好了,证书和 TLS 细节统统不用管。本文用可复制的命令,带你从安装到生产落地跑通 Caddy。

一、为什么是 Caddy:它和 Nginx 差在哪

Caddy 与 Nginx 都能做反向代理和静态托管,但设计哲学不同。Caddy 用 Go 写成,单二进制、无依赖;Nginx 生态成熟、模块丰富。对绝大多数中小型站点,Caddy 的”零配置 HTTPS”能省下大量运维心智。

对比项CaddyNginx
自动 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。

上一篇 Terraform 实战:用 IaC 管理云基础设施
下一篇 Vite 实战:为什么它比 Webpack 快,以及怎么落地
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]