Caddy 部署 Web 应用新手指南:自动 HTTPS、静态服务与反向代理
Caddy 是 Go 写的开源 Web 服务器:自动 HTTPS、Caddyfile 极简配置、原生 HTTP/3、零运行时依赖,内置反向代理/负载均衡/健康检查。本文用 Docker 演示静态站点、HTTPS、请求日志与反向代理全流程。
直接回答:Caddy 是 Go 编写的开源 Web 服务器,核心卖点是"省心"——自动申请续期 HTTPS 证书、Caddyfile 配置只需几行、原生支持 HTTP/3、零运行时依赖。它还能做反向代理(含负载均衡与健康检查),用 Docker 一条命令即可起步。
为什么是 Caddy 而不是 Nginx/Apache
- 自动 HTTPS:首次启动即为域名申请并自动续期证书,无需 certbot 之类外挂
- 配置极简:一个反向代理配置 Caddyfile 两行搞定,不用学一门新配置语言
- HTTP/3 原生:面向未来的传输协议开箱即用
- 零依赖单二进制:跨平台安装运行, footprint 极小
用 Docker 起步
docker run -d -p 80:80 -p 443:443 -p 443:443/udp \
-v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" \
-v "$PWD/site:/srv:ro" \
-v caddy_config:/config \
-v caddy_data:/data \
caddy:2
先准备 Caddyfile 与 site 目录。此示例面向计划公开的站点,主机和云安全组需按需求放行 TCP 80/443;HTTP/3 还需 UDP 443。生产固定受支持镜像 digest,并限制管理 API 只能从可信网络访问。
/data 卷必须持久化——证书与自动 HTTPS 状态都在里面。
静态文件服务与 HTTPS
Caddyfile 一行就是一个站点:
example.com {
root * /srv
file_server
}
需真实域名解析到此主机、ACME 验证可达、出站网络和持久存储正常;满足条件后 Caddy 可自动申请和续期——这是它与前辈们最大的体验差异。
请求日志
example.com {
log {
output stdout
}
}
容器中日志可输出 stdout;默认非终端输出为 JSON,接入采集器前先查看实际输出。将日志送入观测云后,可用 Pipeline 调试检查一条成功请求和一条失败请求,确认状态码、URI 和耗时字段的解析结果,再按这些字段查询。
反向代理
api.example.com {
reverse_proxy backend1:3000 backend2:3000 {
lb_policy round_robin
health_uri /healthz
}
}
负载均衡、主动/被动健康检查可在 reverse_proxy 配置,不能把健康检查自动等同完整熔断器——中小型部署不再需要单独一层网关。
上面的 backend1/backend2 必须在同一可解析网络中且提供 /healthz;不是仅复制域名就存在的后端。多个同域名 Caddyfile 示例应合并到一个站点块,而不是重复定义。
常见问题(FAQ)
Q:Caddy 性能比得上 Nginx 吗?
A:绝大多数 Web 场景两者性能差异不构成瓶颈。Caddy 赢在安全默认值(自动 HTTPS、现代 TLS)与运维省心;性能选择需以真实请求、TLS 和后端负载测试为准。
Q:内网服务没有公网域名能自动 HTTPS 吗?
A:拥有可验证公网域名但服务不公开时可使用 DNS-01(需对应 DNS 模块与最小权限凭证);纯内网名可用 tls internal,客户端必须信任内部 CA,不能获得公开 CA 对任意私有名称签发的证书。
Q:Caddy 适合做生产网关吗?
A:中小规模完全够——负载均衡与健康检查可配置。需要复杂路由规则、细粒度限流时,再考虑专用 API 网关。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。