上一篇文章介绍了 Caddy 通过 DNS Challenge 配置 Wildcard 证书,实现泛域名 HTTPS 自动申请和续签。
实际生产环境中,除了 HTTPS 证书管理,还需要进一步优化:
- 全局参数统一管理;
- ACME 配置统一设置;
- 强制 HTTPS;
- 域名访问规范化;
- HTTP 请求处理;
- 多站点统一管理。
这些功能主要通过 Caddyfile 的:
- Global Options Block(全局配置块)
- Site Block(站点配置块)
实现。
Caddyfile 配置结构
Caddyfile 基本结构
{ # 全局配置}
example.com {
# 站点配置
}全局配置块
全局配置块可以:
- 配置整个 Caddy 实例;
- 对所有站点生效。
例如:
{ email admin@example.com}全局配置块只能存在一个。
站点配置块
站点配置块可以:
- 控制具体域名行为;
- 每个站点独立配置;
- 包含代理、静态文件、跳转等逻辑。
例如:
example.com { reverse_proxy localhost:8000}全局配置块常用配置
配置 ACME 邮箱
申请 Let’s Encrypt 或其他 ACME 证书时使用。
- 避免每个站点重复配置;
- 方便证书到期提醒。
{ email admin@example.com}开启 Debug 模式
开发环境中,开启此功能可以看到更详细的日志,方便排查 TLS、代理问题。
{ debug}生产环境通常选择关闭。
站点配置块常用配置
静态文件代理
example.com { handle { root * /var/www/html file_server }}反向代理
example.com { handle { reverse_proxy 127.0.0.1:8000 }}请求路径分流
Caddy 的 handle 可以实现类似 Nginx location 的路径分流功能,但匹配规则和优先级机制不同。
例如:
example.com { handle /api/* { reverse_proxy 127.0.0.1:8000 } handle { root * /var/www/html file_server }}HTTPS 与域名规范化
强制 HTTPS
Caddy 默认会自动 HTTPS。 例如,访问:
http://example.com会自动跳转到:
https://example.com这是因为 Caddy Automatic HTTPS 默认开启。
只有在特殊场景,例如:
- 自定义跳转规则;
- 多域名入口统一;
- 与其他代理层配合等情况下。
才需要手动配置 redir。
例如:
http://example.com { redir https://example.com{uri} permanent}通常情况下无需手动配置,Caddy 会自动监听 HTTP 请求并完成 HTTPS 跳转。
强制跳转到 www
很多网站需要统一访问入口,这样做的目的一般是:
- SEO 权重统一;
- Cookie 域管理;
- 避免两个站点重复等。
例如用户访问:
https://example.com需要统一跳转到:
https://www.example.com配置:
example.com {
redir https://www.example.com{uri} permanent}
www.example.com {
reverse_proxy localhost:8000}如果使用 www 子域名,需要确保申请证书时包含
www.example.com或*.example.com。需要保证 www 子域名,已完成 DNS 解析。
www 跳转到一级域名
与强制跳转到 www功能相反,目的都是统一网站访问入口,其配置如下:
www.example.com {
redir https://example.com{uri} permanent}
example.com {
reverse_proxy localhost:8000}安全策略
访问认证(类似 nginx auth_basic)
Caddy 不保存明文密码。所以需要执行:
# 根据实际需求替换密码caddy hash-password --plaintext "123456"会得到类似:
$2a$14$xxxx格式的 bcrypt 哈希字符串。
bcrypt 哈希字符串实际前缀和 cost 取决于 Caddy 版本。
修改 Caddyfile 文件,将账号、密码填充至想要加密访问的域名下:
admin.example.com { basic_auth { admin $2a$14$xxxx } reverse_proxy localhost:9000}Caddy 的 basic_auth 使用 bcrypt 哈希保存密码,不保存明文密码。
Basic Auth 必须配合 HTTPS 使用,否则用户名密码可能被截获。
安全 Header
example.com {
header { Strict-Transport-Security "max-age=31536000; includeSubDomains" X-Content-Type-Options "nosniff" X-Frame-Options "SAMEORIGIN" Referrer-Policy "strict-origin-when-cross-origin" }}参数说明:
| Header | 作用 |
|---|---|
| HSTS | 强制 HTTPS |
| nosniff | 防止 MIME 嗅探 |
| X-Frame | 防止 iframe 点击劫持 |
| Referrer | 控制来源信息 |
HSTS 建议确认所有子域名均支持 HTTPS 后开启,否则可能导致部分子域名无法访问。
响应压缩(Gzip / Zstd)
Caddy 可以通过 encode 自动压缩响应内容。
Caddy 会根据客户端发送的 Accept-Encoding 自动选择支持的压缩算法。
常用于:
- HTML
- CSS
- JavaScript
- JSON API
example.com { encode gzip zstd reverse_proxy localhost:8000}常见问题
全局配置块能随意放置吗?
不可以。
- 全局配置块必须位于
Caddyfile文件的最顶部。 - 全局配置块只能有一个。
为什么配置了 HTTPS 还需要 HTTP 重定向?
因为用户可能输入:
example.com用户直接输入域名时,浏览器可能首先通过 HTTP 请求访问,因此需要确保 HTTP 请求能够正确跳转 HTTPS。
明确重定向可以保证 HTTP → HTTPS 统一入口。
为什么 example.com 和 *.example.com 要同时申请?
因为:
*.example.com只能覆盖:
api.example.comblog.example.com等域名,不能覆盖:
example.com为什么配置修改后没有生效?
需要重载配置文件,以 docker-compose 为例,执行:
# 检查配置docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile# 重载配置docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile参考资料
- Caddy 官方文档:介绍 Caddy 的安装、配置、自动 HTTPS、反向代理以及模块扩展等功能。
- Caddy Automatic HTTPS:介绍 Caddy 自动 HTTPS、ACME 证书申请以及自动续签机制。
- Caddyfile 官方文档:介绍 Caddyfile 配置格式、全局配置块、站点配置以及指令使用方式。
- Caddyfile Directives 官方文档:介绍 reverse_proxy、handle、header、encode、redir 等请求处理指令。
- ACME 协议标准(RFC 8555):定义自动化申请、验证和管理 TLS 证书的标准流程。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





