Caddy 的配置核心就是 Caddyfile 文件,你只需要写几行声明式指令,Caddy 就能自动完成 HTTPS 证书申请、反向代理和网站托管,这比传统手工配置要省心得多。
Caddy 这两年在国内开发者圈子里逐渐升温,很多人从 Nginx 或 Apache 转向它,核心原因就是配置简单、自动 HTTPS、默认安全,如果你正在纠结要不要换用 Caddy,或者刚拿到一台服务器不知道从哪下手,这篇文章会从实际场景出发,把 Caddy 配置的各个关键环节讲透,下面进入正题。
Caddy 配置入门:先搞懂 Caddyfile 的语法
Caddyfile 是一个块结构文件,不是逐行执行的脚本
Caddy 的配置文件和 Nginx 的 .conf 文件有本质区别,Caddyfile 采用块结构,每个站点配置以站点地址开头,内部的指令用缩进表示层级,业内专家指出,这种设计让配置信息一目了然,特别适合一眼看出站点对应的规则。
一个最简单的 Caddyfile 长这样:
example.com {
root /var/www/example
file_server
}
这个配置干了三件事:监听 example.com 域名、把 /var/www/example 作为网站根目录、启动静态文件服务,注意 root 中的 表示匹配所有路径,这是一个容易忽略的语法细节。
常用命令有哪些
配置写完后,你要知道这几个操作路径:
caddy start:后台启动 Caddy 服务caddy stop:停止服务caddy reload:平滑重载配置,不中断现有连接caddy fmt:格式化 Caddyfile,解决缩进问题caddy validate:检查配置语法是否正确
建议每次修改配置后先跑一遍 caddy validate,再执行 reload,不少新手直接重载,结果语法错误导致服务退出,白踩一个坑。
caddy反代配置的经典场景:反向代理怎么写
Web 服务反代:一行指令搞定
反向代理是 Caddy 使用频率最高的功能,假设你在 3000 端口跑了一个 Node.js 应用,想通过 api.example.com 对外提供服务,配置只需要这样:
api.example.com {
reverse_proxy localhost:3000
}
Caddy 会自动完成 HTTPS 证书申请,外部用户访问

https://api.example.com 时,流量会被安全转发到本地的 3000 端口,这里不需要写 proxy_pass 那种带斜杠的复杂规则,也不需要手动配置证书路径。
路径区分转发:同一个域名,不同路径去不同服务
如果你想让 example.com/api 走后端接口,而 example.com/static 走静态文件,用 handle 指令做路径分发:
example.com {
handle /api/ {
reverse_proxy localhost:8080
}
handle /static/ {
root /var/www/static
file_server
}
handle {
reverse_proxy localhost:3000
}
}
这个配置块的含义是:/api 开头转发到 8080 端口,/static 开头走本地静态文件,其余所有请求兜底转发到 3000 端口。匹配顺序从上到下,命中即停止,这个逻辑和 Nginx 的 location 类似,但写法更直观。
WebSocket 支持
Caddy 的反代默认支持 WebSocket,不需要额外配置 Upgrade 头,如果你在用 wss:// 协议做实时通信,Caddy 会自动处理握手升级,这也是它比某些老牌反代工具省心的地方。
caddy部署多个网站:一台服务器怎么托管多个域名
多站点共用 80/443 端口
很多场景下,你手上有一台服务器,既挂了博客,又挂了给朋友用的导航站,还跑着一个内部工具,用 Caddy 部署多个网站不需要像 Nginx 那样单独建 sites-enabled 目录,直接在同一个 Caddyfile 里追加块就行:
blog.example.com {
root /var/www/blog
file_server
}
nav.example.com {
root /var/www/nav
file_server
}
tool.example.com {
reverse_proxy localhost:9000
}
Caddy 启动后会同时监听 80 和 443 端口,根据请求的 Host 头自动路由到对应站点。所有站点共享同一套 HTTPS 证书管理机制,互不干扰。
通配符域名配置
如果你有一个泛域名解析,.dev.example.com,想给每个子域名跑不同服务,可以用通配符块:
.dev.example.com {
reverse_proxy localhost:8080
}
这种写法适合多租户场景,配合 Docker 容器做动态路由非常顺手,行业共识认为,Caddy 对通配符证书的支持是目前所有主流 Web 服务器中最省事的,你不需要自己部署 DNS-01 验证脚本。

Caddy 与 Nginx 的对比:哪个更适合你的使用场景
配置复杂度对比
| 对比项 | Caddy | Nginx |
|---|---|---|
| HTTPS 证书 | 自动申请续期 | 需 certbot 配合或手动配置 |
| 配置语法 | 声明式,块结构 | 指令式,上下文嵌套 |
| 重载方式 | caddy reload 内置命令 |
nginx -s reload,需测试配置 |
| 性能表现 | 足够日常使用 | 高并发下更成熟 |
| 模块扩展 | 官方插件用 go build 编译 | 动态模块支持丰富 |
该不该从 Nginx 换到 Caddy
如果你正在对比 Caddy 和 Nginx,先想清楚自己的需求,Nginx 在高并发静态文件服务和复杂 rewrite 规则上确实积累深厚,社区资料多,但如果你是中小项目、个人博客、API 网关,或者极度讨厌证书续期这件事,Caddy 的自动 HTTPS 和极简配置能明显提升效率,实际部署中,不少人在简米云、酷番云服务器上搭配 Caddy + Docker 使用,整个发布流程可以压缩到几分钟。
另一个常见场景是宝塔面板用户,宝塔面板 caddy 配置目前还没有像 Nginx 那样内置支持,但你可以通过安装 Caddy 之后自行编写 Caddyfile,配合 Docker 方式部署,效果也不差,需要留意的是,不要把宝塔的 Nginx 和 Caddy 同时监听 80/443 端口,否则会冲突。
Caddy 配置中的易错点与调优建议
端口被占用怎么排查
Caddy 默认绑定 80/443 端口,如果启动时报 address already in use,说明有别的进程占用了端口,执行:
lsof -i :80 -i :443
找到占用进程后,要么停掉它,要么修改 Caddy 的监听地址,比如让 Caddy 在 8080 端口提供 HTTP 服务,前面再套一层 CDN,据统计,大量端口冲突发生在系统自带 Apache 和宝塔面板的环境中。
正确开启日志和压缩
生产环境一定要记录访问日志,Caddy 支持结构化日志,按站点开启:
example.com { log { output file /var/log/caddy/example.log format json } encode gzip file_server }
encode gzip 开启压缩传输,对文本类资源体积能减少 60% 以上,这在移动端弱网环境下感知明显。
静态资源缓存策略
Caddy 设置缓存有两种思路:一是通过 header 指令手动加 Cache-Control,二是配合 CDN 做边缘缓存,本地配置示例:
example.com {
header /static/ Cache-Control "public, max-age=86400"
root /var/www
file_server
}
这段配置给 /static/ 目录下所有文件设置了 1 天缓存,浏览器重复请求时直接走本地缓存,降低服务器带宽压力。
反向代理后端健康检查
Caddy 3.0 及以上版本支持反向代理健康检查,你可以在 reverse_proxy 中带上主动健康检查配置:
api.example.com {
reverse_proxy localhost:3000 {
health_uri /health
health_interval 30s
health_timeout 5s
}
}
当后端服务 5 秒内没有响应 /health 接口时,Caddy 会自动把流量切到其他健康节点,这在多实例部署时很有用,能避免把请求打到已经挂掉的服务上。
Q&A:caddy 配置相关问题三则
Caddyfile 修改后必须重启吗
不需要重启,执行 caddy reload 即可平滑加载新配置,Caddy 会自动完成证书相关校验和站点路由更新,但如果你的配置里涉及监听端口变化,reload 后可能提示需要重启,这时用 caddy start 后 caddy stop 再启动会更稳妥。
Caddy 可以负载均衡吗
可以。reverse_proxy 支持多个后端地址,Caddy 默认在它们之间做轮询负载均衡,你只需要把后端节点都列出来:
example.com {
reverse_proxy localhost:3000 localhost:3001
}
Caddy 会轮询转发请求,不需要额外安装负载均衡组件,如果你需要会话保持或一致性哈希,可以在配置块里追加 lb_policy 指令,ip_hash 是常用策略。
Caddy 免费吗
Caddy 完全免费使用,包括自动 HTTPS 功能,官方提供商业支持的是 Caddy Enterprise 版本,但普通站点使用开源版没有任何功能缩减,所有核心功能,包括自动 HTTPS、反向代理、HTTP/3 支持,都在免费版里完整提供。

