602 Caddy v2 自动HTTPS Web服务器¶
一句话概述:Caddy 是用 Go 编写的现代 Web 服务器,最大亮点是自动管理 HTTPS 证书,零配置就能启用 HTTPS,支持 HTTP/1-2-3,是 Nginx/Apache 的现代替代品。
核心知识点速查表¶
| 知识点 | 说明 |
|---|---|
| 最新版本 | v2.11.x(2026年) |
| 语言 | Go 编写,单二进制文件部署 |
| 核心特性 | 自动HTTPS、HTTP/3、反向代理、负载均衡 |
| 配置方式 | Caddyfile(简单)或 JSON API(灵活) |
| 证书管理 | 自动申请/续期 Let's Encrypt 证书 |
| 适用场景 | 静态站点、反向代理、API网关、开发环境 |
| 竞品对比 | Nginx(性能极致)、Traefik(容器编排)、Apache(传统) |
一、安装配置¶
1.1 各平台安装¶
# Ubuntu/Debian 安装
# 添加 Caddy 官方 APT 源
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 # 导入 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 # 安装 Caddy
# macOS 安装
brew install caddy # 通过 Homebrew 安装
# Docker 安装
docker run -d \
--name caddy \ # 容器名称
-p 80:80 \ # 映射 HTTP 端口
-p 443:443 \ # 映射 HTTPS 端口
-v caddy_data:/data \ # 持久化证书数据
-v caddy_config:/config \ # 持久化配置
-v $PWD/Caddyfile:/etc/caddy/Caddyfile \ # 挂载配置文件
caddy:latest # 使用最新镜像
# 验证安装
caddy version # 查看版本号
1.2 配置文件位置¶
# 系统服务配置文件
/etc/caddy/Caddyfile # 主配置文件(白话:Caddy 的"菜谱")
/var/lib/caddy/.local/share/caddy # 证书存储目录
/var/log/caddy/ # 日志目录(需自行配置)
二、基本使用¶
2.1 最简单的静态网站¶
# Caddyfile - 最简配置
# 白话:告诉 Caddy "在 example.com 上提供 /var/www/html 目录的文件"
example.com {
root * /var/www/html # 设置网站根目录(* 表示所有路径)
file_server # 启用静态文件服务
}
# 就这两行!Caddy 自动申请 HTTPS 证书,自动 HTTP→HTTPS 跳转
2.2 反向代理(最常用)¶
# 反向代理到后端服务
# 白话:用户访问 api.example.com,Caddy 偷偷转发给本机 8080 端口的应用
api.example.com {
reverse_proxy localhost:8080 # 将请求转发到后端应用
}
# 多后端负载均衡
api.example.com {
reverse_proxy localhost:8080 localhost:8081 localhost:8082 {
lb_policy round_robin # 轮询策略(白话:三个后端轮着来)
health_uri /health # 健康检查路径
health_interval 10s # 每 10 秒检查一次
}
}
2.3 本地开发 HTTPS¶
# 本地开发环境(localhost 自动生成自签名证书)
localhost {
reverse_proxy localhost:3000 # 前端开发服务器
}
localhost:8443 {
reverse_proxy localhost:8080 # 后端 API 服务器
}
2.4 常用命令¶
# 服务管理
sudo systemctl start caddy # 启动 Caddy
sudo systemctl stop caddy # 停止 Caddy
sudo systemctl reload caddy # 重载配置(不中断服务)
sudo systemctl status caddy # 查看运行状态
# 配置管理
caddy fmt --overwrite Caddyfile # 格式化配置文件
caddy validate --config Caddyfile # 验证配置是否正确
caddy adapt --config Caddyfile # 将 Caddyfile 转为 JSON 格式
# 快速启动(不用写配置文件)
caddy file-server --root /var/www/html --listen :8080 # 快速启动文件服务
caddy reverse-proxy --from :443 --to localhost:8080 # 快速反向代理
三、高级用法¶
3.1 多站点配置¶
# 一个 Caddyfile 配置多个站点
# 白话:一台服务器同时跑多个网站,每个域名对应不同服务
blog.example.com {
root * /var/www/blog # 博客站点
file_server
encode gzip zstd # 启用 gzip 和 zstd 压缩(加快加载)
}
app.example.com {
reverse_proxy localhost:3000 # 前端应用
}
api.example.com {
reverse_proxy /v1/* localhost:8080 # API v1 转发到 8080
reverse_proxy /v2/* localhost:8081 # API v2 转发到 8081
}
3.2 CORS 和安全头¶
api.example.com {
# 跨域资源共享设置(白话:允许前端从不同域名调用 API)
header {
Access-Control-Allow-Origin "https://app.example.com" # 允许的来源
Access-Control-Allow-Methods "GET, POST, PUT, DELETE" # 允许的方法
Access-Control-Allow-Headers "Content-Type, Authorization" # 允许的请求头
}
# 安全头(白话:告诉浏览器加强安全防护)
header {
X-Content-Type-Options "nosniff" # 防止 MIME 类型嗅探
X-Frame-Options "DENY" # 禁止被嵌入 iframe
Strict-Transport-Security "max-age=31536000" # 强制 HTTPS(一年)
}
reverse_proxy localhost:8080
}
3.3 日志配置¶
example.com {
log {
output file /var/log/caddy/access.log {
roll_size 100mb # 单个日志文件最大 100MB
roll_keep 10 # 保留 10 个历史文件
roll_compression zstd # 使用 zstd 压缩旧日志(v2.11新特性)
}
format json # JSON 格式方便日志分析
level INFO # 日志级别
}
reverse_proxy localhost:8080
}
3.4 基本认证¶
admin.example.com {
# 基本认证(白话:访问前弹出用户名密码框)
basicauth {
# 生成密码哈希:caddy hash-password
admin $2a$14$xxx... # 用户名 admin,密码哈希值
}
reverse_proxy localhost:9090
}
3.5 通配符证书¶
# 通配符证书(白话:*.example.com 下所有子域名共用一个证书)
*.example.com {
tls {
dns cloudflare {env.CF_API_TOKEN} # 通过 DNS 验证申请通配符证书
}
@blog host blog.example.com
handle @blog {
reverse_proxy localhost:3001
}
@api host api.example.com
handle @api {
reverse_proxy localhost:8080
}
}
四、常见报错与解决¶
4.1 证书申请失败¶
原因:域名 DNS 未指向服务器 / 80 端口被防火墙拦截 解决:
# 检查 DNS 解析
dig example.com # 确认 A 记录指向服务器 IP
nslookup example.com # 另一种 DNS 查询方式
# 检查防火墙
sudo ufw allow 80/tcp # 开放 80 端口(HTTP 验证需要)
sudo ufw allow 443/tcp # 开放 443 端口
4.2 端口被占用¶
原因:80/443 端口已被 Nginx/Apache 占用 解决:
sudo lsof -i :80 # 查看谁占了 80 端口
sudo systemctl stop nginx # 停掉 Nginx
sudo systemctl disable nginx # 禁止 Nginx 开机启动
4.3 配置语法错误¶
caddy validate --config /etc/caddy/Caddyfile # 先验证再重载
caddy fmt --overwrite /etc/caddy/Caddyfile # 自动格式化
4.4 权限问题¶
五、速查表¶
| 操作 | 命令/配置 |
|---|---|
| 安装(Ubuntu) | sudo apt install caddy |
| 启动服务 | sudo systemctl start caddy |
| 重载配置 | sudo systemctl reload caddy |
| 验证配置 | caddy validate --config Caddyfile |
| 格式化配置 | caddy fmt --overwrite Caddyfile |
| 快速文件服务 | caddy file-server --root ./dist |
| 快速反向代理 | caddy reverse-proxy --to localhost:8080 |
| 生成密码哈希 | caddy hash-password |
| 查看版本 | caddy version |
六、同类工具对比¶
| 特性 | Caddy | Nginx | Apache | Traefik |
|---|---|---|---|---|
| 自动HTTPS | 内置自动 | 需手动配置 | 需手动配置 | 支持 |
| 配置难度 | 极简 | 中等 | 复杂 | 中等 |
| 性能 | 优秀 | 极致 | 良好 | 良好 |
| HTTP/3 | 支持 | 需编译 | 不支持 | 支持 |
| 热重载 | 支持 | 支持 | 支持 | 自动 |
| 容器友好 | 优秀 | 良好 | 一般 | 极佳 |
| 学习曲线 | 低 | 中 | 高 | 中 |
| 适用场景 | 中小项目首选 | 高并发场景 | 传统项目 | K8s环境 |
选型建议:个人项目/中小站点优先 Caddy(省心);大规模高并发选 Nginx;Kubernetes 环境选 Traefik。
参考资料:Caddy 官方文档 | GitHub 仓库 | Caddy 特性列表