<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>KangLab</title><description>后端开发者，专注系统设计与工程实践</description><link>https://www.pyart.cn/</link><language>zh_CN</language><item><title>Caddy 进阶配置详解：全局配置、HTTPS 跳转、访问认证与安全策略</title><link>https://www.pyart.cn/posts/caddy-advanced-configuration/</link><guid isPermaLink="true">https://www.pyart.cn/posts/caddy-advanced-configuration/</guid><description>深入学习 Caddyfile 高级配置，包括全局配置块、HTTP 强制 HTTPS、域名规范化、访问认证、安全 Header、压缩以及生产环境配置实践。</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一篇文章介绍了 Caddy 通过 DNS Challenge 配置 Wildcard 证书，实现泛域名 HTTPS 自动申请和续签。&lt;/p&gt;
&lt;p&gt;实际生产环境中，除了 HTTPS 证书管理，还需要进一步优化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全局参数统一管理；&lt;/li&gt;
&lt;li&gt;ACME 配置统一设置；&lt;/li&gt;
&lt;li&gt;强制 HTTPS；&lt;/li&gt;
&lt;li&gt;域名访问规范化；&lt;/li&gt;
&lt;li&gt;HTTP 请求处理；&lt;/li&gt;
&lt;li&gt;多站点统一管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些功能主要通过 &lt;code&gt;Caddyfile&lt;/code&gt; 的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Global Options Block（全局配置块）&lt;/li&gt;
&lt;li&gt;Site Block（站点配置块）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现。&lt;/p&gt;
&lt;h2&gt;Caddyfile 配置结构&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;Caddyfile&lt;/code&gt; 基本结构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    # 全局配置
}

example.com {

    # 站点配置

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;全局配置块&lt;/h3&gt;
&lt;p&gt;全局配置块可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置整个 Caddy 实例；&lt;/li&gt;
&lt;li&gt;对所有站点生效。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    email admin@example.com
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;全局配置块只能存在一个。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;站点配置块&lt;/h3&gt;
&lt;p&gt;站点配置块可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;控制具体域名行为；&lt;/li&gt;
&lt;li&gt;每个站点独立配置；&lt;/li&gt;
&lt;li&gt;包含代理、静态文件、跳转等逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy localhost:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;全局配置块常用配置&lt;/h2&gt;
&lt;h3&gt;配置 ACME 邮箱&lt;/h3&gt;
&lt;p&gt;申请 Let&apos;s Encrypt 或其他 ACME 证书时使用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;避免每个站点重复配置；&lt;/li&gt;
&lt;li&gt;方便证书到期提醒。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    email admin@example.com
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;开启 Debug 模式&lt;/h3&gt;
&lt;p&gt;开发环境中，开启此功能可以看到更详细的日志，方便排查 TLS、代理问题。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    debug
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;生产环境通常选择关闭。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;站点配置块常用配置&lt;/h2&gt;
&lt;h3&gt;静态文件代理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    handle {
        root * /var/www/html
        file_server
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;反向代理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    handle {
        reverse_proxy 127.0.0.1:8000
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;请求路径分流&lt;/h3&gt;
&lt;p&gt;Caddy 的 &lt;code&gt;handle&lt;/code&gt; 可以实现类似 Nginx &lt;code&gt;location&lt;/code&gt; 的路径分流功能，但匹配规则和优先级机制不同。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    handle /api/* {
        reverse_proxy 127.0.0.1:8000
    }
    handle {
        root * /var/www/html
        file_server
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;HTTPS 与域名规范化&lt;/h2&gt;
&lt;h3&gt;强制 HTTPS&lt;/h3&gt;
&lt;p&gt;Caddy 默认会自动 HTTPS。
例如，访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会自动跳转到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是因为 Caddy Automatic HTTPS 默认开启。&lt;/p&gt;
&lt;p&gt;只有在特殊场景，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自定义跳转规则；&lt;/li&gt;
&lt;li&gt;多域名入口统一；&lt;/li&gt;
&lt;li&gt;与其他代理层配合等情况下。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;才需要手动配置 &lt;code&gt;redir&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://example.com {
    redir https://example.com{uri} permanent
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;通常情况下无需手动配置，Caddy 会自动监听 HTTP 请求并完成 HTTPS 跳转。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;强制跳转到 www&lt;/h3&gt;
&lt;p&gt;很多网站需要统一访问入口，这样做的目的一般是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SEO 权重统一；&lt;/li&gt;
&lt;li&gt;Cookie 域管理；&lt;/li&gt;
&lt;li&gt;避免两个站点重复等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如用户访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要统一跳转到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://www.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {

    redir https://www.example.com{uri} permanent
}

www.example.com {

    reverse_proxy localhost:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果使用 www 子域名，需要确保申请证书时包含 &lt;code&gt;www.example.com&lt;/code&gt; 或 &lt;code&gt;*.example.com&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;需要保证 www 子域名，已完成 DNS 解析。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;www 跳转到一级域名&lt;/h3&gt;
&lt;p&gt;与强制跳转到 www功能相反，目的都是统一网站访问入口，其配置如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www.example.com {

    redir https://example.com{uri} permanent
}


example.com {

    reverse_proxy localhost:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安全策略&lt;/h2&gt;
&lt;h3&gt;访问认证（类似 nginx auth_basic）&lt;/h3&gt;
&lt;p&gt;Caddy 不保存明文密码。所以需要执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 根据实际需求替换密码
caddy hash-password --plaintext &quot;123456&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会得到类似：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$2a$14$xxxx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;格式的 bcrypt 哈希字符串。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;bcrypt 哈希字符串实际前缀和 cost 取决于 Caddy 版本。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;修改 &lt;code&gt;Caddyfile&lt;/code&gt; 文件，将账号、密码填充至想要加密访问的域名下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;admin.example.com {
    basic_auth {
        admin $2a$14$xxxx
    }
    reverse_proxy localhost:9000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Caddy 的 basic_auth 使用 bcrypt 哈希保存密码，不保存明文密码。&lt;/p&gt;
&lt;p&gt;Basic Auth 必须配合 HTTPS 使用，否则用户名密码可能被截获。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;安全 Header&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {

    header {
        Strict-Transport-Security &quot;max-age=31536000; includeSubDomains&quot;
        X-Content-Type-Options &quot;nosniff&quot;
        X-Frame-Options &quot;SAMEORIGIN&quot;
        Referrer-Policy &quot;strict-origin-when-cross-origin&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HSTS&lt;/td&gt;
&lt;td&gt;强制 HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nosniff&lt;/td&gt;
&lt;td&gt;防止 MIME 嗅探&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-Frame&lt;/td&gt;
&lt;td&gt;防止 iframe 点击劫持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referrer&lt;/td&gt;
&lt;td&gt;控制来源信息&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;HSTS 建议确认所有子域名均支持 HTTPS 后开启，否则可能导致部分子域名无法访问。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;响应压缩（Gzip / Zstd）&lt;/h3&gt;
&lt;p&gt;Caddy 可以通过 &lt;code&gt;encode&lt;/code&gt; 自动压缩响应内容。
Caddy 会根据客户端发送的 Accept-Encoding 自动选择支持的压缩算法。
常用于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;JSON API&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    encode gzip zstd
    reverse_proxy localhost:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;全局配置块能随意放置吗？&lt;/h3&gt;
&lt;p&gt;不可以。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;全局配置块必须位于 &lt;code&gt;Caddyfile&lt;/code&gt; 文件的最顶部。&lt;/li&gt;
&lt;li&gt;全局配置块只能有一个。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;为什么配置了 HTTPS 还需要 HTTP 重定向？&lt;/h3&gt;
&lt;p&gt;因为用户可能输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用户直接输入域名时，浏览器可能首先通过 HTTP 请求访问，因此需要确保 HTTP 请求能够正确跳转 HTTPS。&lt;/p&gt;
&lt;p&gt;明确重定向可以保证 HTTP → HTTPS 统一入口。&lt;/p&gt;
&lt;h3&gt;为什么 example.com 和 *.example.com 要同时申请？&lt;/h3&gt;
&lt;p&gt;因为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只能覆盖：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;api.example.com
blog.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等域名，不能覆盖：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;为什么配置修改后没有生效？&lt;/h3&gt;
&lt;p&gt;需要重载配置文件，以 &lt;code&gt;docker-compose&lt;/code&gt; 为例，执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查配置
docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile
# 重载配置
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/&quot;&gt;Caddy 官方文档&lt;/a&gt;：介绍 Caddy 的安装、配置、自动 HTTPS、反向代理以及模块扩展等功能。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/automatic-https&quot;&gt;Caddy Automatic HTTPS&lt;/a&gt;：介绍 Caddy 自动 HTTPS、ACME 证书申请以及自动续签机制。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/caddyfile&quot;&gt;Caddyfile 官方文档&lt;/a&gt;：介绍 Caddyfile 配置格式、全局配置块、站点配置以及指令使用方式。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/caddyfile/directives&quot;&gt;Caddyfile Directives 官方文档&lt;/a&gt;：介绍 reverse_proxy、handle、header、encode、redir 等请求处理指令。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8555&quot;&gt;ACME 协议标准（RFC 8555）&lt;/a&gt;：定义自动化申请、验证和管理 TLS 证书的标准流程。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Caddy 泛域名 HTTPS 配置教程：Docker 构建、DNS Challenge 与 Wildcard 证书</title><link>https://www.pyart.cn/posts/caddy-wildcard-https-tutorial/</link><guid isPermaLink="true">https://www.pyart.cn/posts/caddy-wildcard-https-tutorial/</guid><description>使用 Caddy 配置泛域名 HTTPS，通过 DNS Challenge 自动申请和续签 Wildcard 证书，实现多个子域名统一管理。</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一篇文章介绍了 Caddy 单域名 HTTPS 部署方式，
通过 Caddyfile 实现静态资源托管、反向代理以及自动 HTTPS。&lt;/p&gt;
&lt;p&gt;当项目进一步拆分为多个独立服务时，通常会为不同服务配置独立子域名。&lt;/p&gt;
&lt;p&gt;随着项目规模增加，通常会拆分出更多服务，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API 服务；&lt;/li&gt;
&lt;li&gt;管理后台；&lt;/li&gt;
&lt;li&gt;博客系统；&lt;/li&gt;
&lt;li&gt;文件服务；&lt;/li&gt;
&lt;li&gt;监控平台等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些服务通常会使用不同的子域名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;api.example.com
admin.example.com
blog.example.com
cdn.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果每个子域名单独申请 HTTPS 证书，需要维护多个证书配置。&lt;/p&gt;
&lt;p&gt;此时可以使用泛域名证书（Wildcard Certificate）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过一个证书覆盖多个一级子域名，实现统一 HTTPS 管理。&lt;/p&gt;
&lt;h2&gt;什么是泛域名证书？&lt;/h2&gt;
&lt;p&gt;泛域名证书，也称通配符证书（Wildcard Certificate）。&lt;/p&gt;
&lt;p&gt;它通过&lt;code&gt;*&lt;/code&gt;匹配指定层级下的所有子域名。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以匹配如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;api.example.com
blog.example.com
admin.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但不支持：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;test.api.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要支持多级子域名，则需要申请：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.api.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;泛域名与单域名区别&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;单域名证书&lt;/th&gt;
&lt;th&gt;泛域名证书&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;示例&lt;/td&gt;
&lt;td&gt;example.com&lt;/td&gt;
&lt;td&gt;*.example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;覆盖范围&lt;/td&gt;
&lt;td&gt;单个域名&lt;/td&gt;
&lt;td&gt;一级子域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;验证方式&lt;/td&gt;
&lt;td&gt;HTTP Challenge&lt;/td&gt;
&lt;td&gt;DNS Challenge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置难度&lt;/td&gt;
&lt;td&gt;简单&lt;/td&gt;
&lt;td&gt;较高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;单站点&lt;/td&gt;
&lt;td&gt;多服务、多子域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自动续签&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;为什么泛域名需要 DNS Challenge？&lt;/h2&gt;
&lt;p&gt;普通 HTTPS 证书通常使用 HTTP Challenge。&lt;/p&gt;
&lt;p&gt;验证流程为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;申请证书
↓
CA 返回验证信息
↓
服务器提供验证文件
↓
CA 访问验证地址
↓
签发证书
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com/.well-known/acme-challenge/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是泛域名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无法通过 HTTP Challenge 验证。&lt;/p&gt;
&lt;p&gt;因为 CA 需要确认：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;申请者是否拥有整个域名的 DNS 控制权限。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因此泛域名证书需要使用&lt;code&gt;DNS Challenge&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;验证流程：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;申请证书
↓
插件调用 DNS Provider API
↓
自动创建 TXT 记录
_acme-challenge.example.com
↓
CA 查询 TXT 记录
↓
验证成功
↓
签发证书
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;准备环境&lt;/h2&gt;
&lt;p&gt;本文示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;域名：
example.com

目标：
*.example.com

DNS 服务商：
阿里云 DNS

Web Server：
Caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要准备：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个自己的域名；&lt;/li&gt;
&lt;li&gt;DNS 服务商 API 权限；&lt;/li&gt;
&lt;li&gt;支持 DNS Provider 的 Caddy。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果服务器位于中国大陆：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;域名需要提前完成备案，详见&lt;a href=&quot;https://beian.miit.gov.cn/&quot;&gt;域名备案&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;网站服务需要符合相关管理要求&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装支持 DNS Challenge 的 Caddy&lt;/h2&gt;
&lt;p&gt;Caddy 默认支持自动 HTTPS。
但是：&lt;code&gt;DNS Challenge&lt;/code&gt;需要额外安装对应的 DNS Provider 插件。&lt;/p&gt;
&lt;p&gt;例如，阿里云 DNS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;github.com/caddy-dns/alidns
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cloudflare：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;github.com/caddy-dns/cloudflare
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本文以 Docker 部署方式为例。&lt;/p&gt;
&lt;p&gt;使用 Docker 构建支持 DNS Provider 的 Caddy。&lt;/p&gt;
&lt;p&gt;由于官方 Caddy 镜像默认不包含 DNS Provider，需要基于官方镜像重新构建。&lt;/p&gt;
&lt;p&gt;目录结构为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;caddy/
├── Dockerfile
├── Caddyfile
├── docker-compose.yaml
├── .env
├── data/
└── config/
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;vim&lt;/code&gt; 编辑&lt;code&gt;Dockerfile&lt;/code&gt;文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;vim Dockerfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM caddy:builder AS builder

ENV GOPROXY=https://goproxy.cn,direct

RUN xcaddy build \
    --with github.com/caddy-dns/alidns


FROM caddy:latest

COPY --from=builder /usr/bin/caddy /usr/bin/caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;国内服务器构建时可能无法访问 Go 官方代理，因此这里使用国内 Go Proxy 提高依赖下载成功率。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;构建&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker build -t caddy-custom .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建完成后，当前镜像已经包含：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dns.providers.alidns
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;插件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;vim&lt;/code&gt; 编辑 &lt;code&gt;.env&lt;/code&gt; 文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以阿里云为例，将 &lt;code&gt;AccessKey ID&lt;/code&gt; 和 &lt;code&gt;AccessKey Secret&lt;/code&gt; 写入到文件中。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ALIYUN_ACCESS_KEY_ID=你的AccessKeyID
ALIYUN_ACCESS_KEY_SECRET=你的AccessKeySecret
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;vim&lt;/code&gt; 编辑 &lt;code&gt;docker-compose.yaml&lt;/code&gt; 文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;services:
  caddy:
    image: caddy-custom:latest
    container_name: caddy
    restart: unless-stopped
    ports:
      - &quot;80:80&quot;
      - &quot;443:443&quot;
      - &quot;443:443/udp&quot;
    volumes:
      # Caddy 配置文件
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      # 自动申请的证书、ACME 数据等
      - ./data:/data
      # Caddy 配置持久化
      - ./config:/config
    environment:
      ALIYUN_ACCESS_KEY_ID: ${ALIYUN_ACCESS_KEY_ID}
      ALIYUN_ACCESS_KEY_SECRET: ${ALIYUN_ACCESS_KEY_SECRET}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果 Caddy 与后端服务运行在不同 Docker Compose 网络中：&lt;/p&gt;
&lt;p&gt;推荐创建共享 Docker Network：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker network create proxy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后让 Caddy 和后端服务加入同一个网络。&lt;/p&gt;
&lt;p&gt;如果后端服务运行在宿主机，也可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;network_mode: host
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接访问宿主机端口。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  caddy:
    image: caddy-custom:latest
    container_name: caddy
    restart: unless-stopped
    network_mode: host
    volumes:
      # Caddy 配置文件
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      # 自动申请的证书、ACME 数据等
      - ./data:/data
      # Caddy 配置持久化
      - ./config:/config
    environment:
      ALIYUN_ACCESS_KEY_ID: ${ALIYUN_ACCESS_KEY_ID}
      ALIYUN_ACCESS_KEY_SECRET: ${ALIYUN_ACCESS_KEY_SECRET}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;docker compose 会自动读取当前目录下的 &lt;code&gt;.env&lt;/code&gt; 文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;host 模式适合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Caddy 在宿主机&lt;/li&gt;
&lt;li&gt;后端服务也在宿主机&lt;/li&gt;
&lt;li&gt;需要监听宿主网络&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;编辑 &lt;code&gt;Caddyfile&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;example.com, *.example.com {

    tls {
        dns alidns {
            access_key_id {env.ALIYUN_ACCESS_KEY_ID}
            access_key_secret {env.ALIYUN_ACCESS_KEY_SECRET}
        }
    }

    handle {
        root * /data/home
        file_server
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;启动容器&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;验证证书申请情况&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker compose logs -f caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功时会看到类似：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;obtaining certificate
presenting DNS challenge
certificate obtained successfully
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等内容。&lt;/p&gt;
&lt;p&gt;验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl s_client \
-connect api.example.com:443 \
-servername api.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;泛域名证书下的多服务配置&lt;/h2&gt;
&lt;p&gt;泛域名证书的主要用途，就是让多个子域名共享同一个 HTTPS 证书。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以同时覆盖：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;api.example.com
admin.example.com
blog.example.com
cdn.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caddy 可以通过同一个 Wildcard 证书统一管理这些 HTTPS 请求。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com, *.example.com {

    tls {
        dns alidns {
            access_key_id {env.ALIYUN_ACCESS_KEY_ID}
            access_key_secret {env.ALIYUN_ACCESS_KEY_SECRET}
        }
    }

    @api host api.example.com
    handle @api {
        reverse_proxy 127.0.0.1:8000
    }


    @admin host admin.example.com
    handle @admin {
        reverse_proxy 127.0.0.1:9000
    }


    @blog host blog.example.com
    handle @blog {
        root * /var/www/blog
        file_server
    }


    @cdn host cdn.example.com
    handle @cdn {
        root * /var/www/cdn
        file_server
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;未匹配的子域名会进入默认 handle。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这样 Caddy 会自动：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 DNS Challenge 验证域名所有权；&lt;/li&gt;
&lt;li&gt;申请 Wildcard 证书；&lt;/li&gt;
&lt;li&gt;自动续签证书；&lt;/li&gt;
&lt;li&gt;为不同子域名提供 HTTPS。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;常见 DNS Provider&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DNS 服务商&lt;/th&gt;
&lt;th&gt;Provider 名称&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;阿里云 DNS&lt;/td&gt;
&lt;td&gt;alidns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;腾讯云 DNSPod&lt;/td&gt;
&lt;td&gt;tencentcloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Route53&lt;/td&gt;
&lt;td&gt;route53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;华为云 DNS&lt;/td&gt;
&lt;td&gt;huaweicloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud DNS&lt;/td&gt;
&lt;td&gt;gcpdns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;DNS Provider 插件属于第三方模块，使用前请确认对应仓库维护状态。&lt;/p&gt;
&lt;p&gt;更多 Provider 见 &lt;a href=&quot;https://github.com/caddy-dns&quot;&gt;Caddy DNS Provider 官方仓库&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;泛域名证书可以覆盖所有子域名吗？&lt;/h3&gt;
&lt;p&gt;不可以。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只能匹配一级子域名，如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;api.example.com
blog.example.com
admin.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是无法匹配：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.api.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要支持多级子域名，需要申请：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.api.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Caddy 为什么需要重新构建？&lt;/h3&gt;
&lt;p&gt;因为官方 Caddy 镜像只包含官方模块。&lt;/p&gt;
&lt;p&gt;DNS Challenge Provider（例如阿里云 DNS、Cloudflare 等）属于第三方模块，需要通过 &lt;code&gt;xcaddy&lt;/code&gt; 编译进去。
构建后 Caddy 才支持：&lt;code&gt;alidns&lt;/code&gt;等。&lt;/p&gt;
&lt;h3&gt;Caddy 可以代理 Docker 容器吗？&lt;/h3&gt;
&lt;p&gt;可以。&lt;/p&gt;
&lt;p&gt;如果 Caddy 与后端服务运行在同一个 Docker Compose 网络中，可以直接使用服务名访问。&lt;/p&gt;
&lt;h3&gt;DNS 验证失败怎么办？&lt;/h3&gt;
&lt;p&gt;检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AccessKey 是否正确&lt;/li&gt;
&lt;li&gt;API 是否拥有 DNS 权限&lt;/li&gt;
&lt;li&gt;TXT 记录是否生效&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;查看：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig TXT _acme-challenge.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;泛域名证书适用于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多个 Web 服务&lt;/li&gt;
&lt;li&gt;API 服务拆分&lt;/li&gt;
&lt;li&gt;Docker 多容器部署&lt;/li&gt;
&lt;li&gt;个人服务器环境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Caddy
+
DNS Challenge
+
Wildcard Certificate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动申请证书&lt;/li&gt;
&lt;li&gt;自动续签&lt;/li&gt;
&lt;li&gt;多子域名统一 HTTPS&lt;/li&gt;
&lt;li&gt;降低维护成本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于个人服务器和中小型项目：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是一种更加优雅的 HTTPS 管理方案。&lt;/p&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;p&gt;本文内容参考以下官方文档和标准资料：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://caddyserver.com/docs/&quot;&gt;Caddy 官方文档&lt;/a&gt;：介绍 Caddy 的安装、配置、自动 HTTPS、反向代理以及模块扩展等功能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://caddyserver.com/docs/automatic-https&quot;&gt;Caddy Automatic HTTPS&lt;/a&gt;：介绍 Caddy 自动 HTTPS、ACME 证书申请以及自动续签机制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/caddyserver/xcaddy&quot;&gt;xcaddy 官方仓库&lt;/a&gt;：用于构建包含第三方模块的自定义 Caddy 二进制文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/caddy-dns&quot;&gt;Caddy DNS Provider 插件&lt;/a&gt;：提供不同 DNS 服务商对应的 DNS Challenge 插件实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://letsencrypt.org/docs/&quot;&gt;Let&apos;s Encrypt 官方文档&lt;/a&gt;：介绍免费 TLS 证书签发流程以及 ACME 协议相关内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8555&quot;&gt;ACME 协议标准（RFC 8555）&lt;/a&gt;：定义自动化申请、验证和管理 TLS 证书的标准流程。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Caddy 单域名多服务部署教程：反向代理、自动 HTTPS 与 Caddyfile 配置</title><link>https://www.pyart.cn/posts/caddy-https-configuration/</link><guid isPermaLink="true">https://www.pyart.cn/posts/caddy-https-configuration/</guid><description>Caddy 单域名多服务部署教程，介绍 Caddy Web 服务器安装、Caddyfile 配置、静态网站托管、反向代理、自动 HTTPS SSL 证书申请与续签方法，适用于 FastAPI、Node.js、Java、React、Vue、Astro 等项目部署。</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;适用场景&lt;/h2&gt;
&lt;p&gt;本文适用于以下部署环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux 云服务器；&lt;/li&gt;
&lt;li&gt;Docker 部署环境；&lt;/li&gt;
&lt;li&gt;FastAPI 后端服务；&lt;/li&gt;
&lt;li&gt;React / Vue / Astro 前端项目；&lt;/li&gt;
&lt;li&gt;个人博客和中小型 Web 应用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Caddy 是什么？&lt;/h2&gt;
&lt;p&gt;Caddy 是一个基于 Go 语言开发的现代 Web 服务器。&lt;/p&gt;
&lt;p&gt;它集成了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web Server（静态文件服务器）&lt;/li&gt;
&lt;li&gt;Reverse Proxy（反向代理）&lt;/li&gt;
&lt;li&gt;Automatic HTTPS（自动 HTTPS）&lt;/li&gt;
&lt;li&gt;HTTP/2&lt;/li&gt;
&lt;li&gt;HTTP/3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;等功能。&lt;/p&gt;
&lt;p&gt;简单理解：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Caddy 类似于 Nginx，但它通过更简单的配置文件和自动 HTTPS 机制，降低了网站部署和维护成本。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Caddy 可以做什么？&lt;/h2&gt;
&lt;p&gt;Caddy 常用于以下场景：&lt;/p&gt;
&lt;h3&gt;1. 静态网站托管&lt;/h3&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vue / React 构建后的前端项目；&lt;/li&gt;
&lt;li&gt;Astro、Hugo 等静态博客；&lt;/li&gt;
&lt;li&gt;HTML、CSS、JavaScript 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 反向代理后端服务&lt;/h3&gt;
&lt;p&gt;Caddy 可以将公网请求转发到本地应用。&lt;/p&gt;
&lt;h3&gt;3. 自动 HTTPS&lt;/h3&gt;
&lt;p&gt;Caddy 默认支持 Let&apos;s Encrypt。&lt;/p&gt;
&lt;p&gt;无需手动：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;申请证书；&lt;/li&gt;
&lt;li&gt;配置证书路径；&lt;/li&gt;
&lt;li&gt;设置自动续期；&lt;/li&gt;
&lt;li&gt;定期 reload 服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只需要：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy localhost:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caddy 会自动完成 HTTPS 配置。&lt;/p&gt;
&lt;h2&gt;Caddy 和 Nginx 如何选择？&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比&lt;/th&gt;
&lt;th&gt;Caddy&lt;/th&gt;
&lt;th&gt;Nginx&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;配置难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ 简单，配置文件简洁易读&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ 较复杂，需要理解更多指令和模块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;自动申请、配置和续签 TLS 证书&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;通常需要手动申请、配置和续签证书&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性能&lt;/td&gt;
&lt;td&gt;很高，满足绝大多数中小型应用需求&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;极高，针对高并发场景深度优化&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;静态资源&lt;/td&gt;
&lt;td&gt;支持，性能优秀&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;支持，性能非常优秀&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;反向代理&lt;/td&gt;
&lt;td&gt;支持，配置简单&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;支持，非常成熟稳定&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;原生支持，默认集成 QUIC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;支持，但通常需要额外配置和版本支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;企业生态&lt;/td&gt;
&lt;td&gt;快速增长，现代化部署场景应用增多&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;非常成熟，拥有大量企业级实践&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习成本&lt;/td&gt;
&lt;td&gt;较低，适合快速部署&lt;/td&gt;
&lt;td&gt;较高，需要掌握更多配置和优化技巧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置可读性&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Caddyfile 简洁直观，接近自然语言&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;配置体系复杂，学习曲线较高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模块生态&lt;/td&gt;
&lt;td&gt;较少，但官方功能覆盖常见需求&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;生态丰富，拥有大量第三方模块&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;资源占用&lt;/td&gt;
&lt;td&gt;Go Runtime 会带来一定额外开销，但现代服务器环境通常影响有限&lt;/td&gt;
&lt;td&gt;资源控制能力强，长期优化成熟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高并发能力&lt;/td&gt;
&lt;td&gt;性能优秀，可以满足大多数中小型及部分大型应用场景&lt;/td&gt;
&lt;td&gt;长期经过大规模生产环境验证，适合复杂高并发场景&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;部署体验&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;非常优秀，适合 Docker、个人服务器和快速部署&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;成熟稳定，更适合长期运维和企业环境&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果目标是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;个人网站；&lt;/li&gt;
&lt;li&gt;小型项目；&lt;/li&gt;
&lt;li&gt;Docker 部署；&lt;/li&gt;
&lt;li&gt;快速上线 HTTPS 服务；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Caddy 通常是更简单的选择。&lt;/p&gt;
&lt;p&gt;如果目标是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大规模企业架构；&lt;/li&gt;
&lt;li&gt;复杂负载均衡；&lt;/li&gt;
&lt;li&gt;深度定制网络策略；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nginx 生态更加成熟。&lt;/p&gt;
&lt;h2&gt;Caddy 安装&lt;/h2&gt;
&lt;h3&gt;Debian / Ubuntu 安装&lt;/h3&gt;
&lt;p&gt;推荐使用官方软件源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; \
| sudo gpg --dearmor \
-o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list

sudo apt update

sudo apt install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;caddy version
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 安装&lt;/h3&gt;
&lt;p&gt;拉取官方镜像：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker pull caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;简单运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p data config

docker run -d \
--name caddy \
--restart unless-stopped \
-p 80:80 \
-p 443:443 \
-v $(pwd)/Caddyfile:/etc/caddy/Caddyfile:ro \
-v $(pwd)/data:/data \
-v $(pwd)/config:/config \
caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;其他系统安装&lt;/h3&gt;
&lt;p&gt;其他系统安装方式：&lt;/p&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://caddyserver.com.cn/docs/install&quot;&gt;Caddy 官方中文文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;使用 Caddy 先决条件&lt;/h2&gt;
&lt;p&gt;Caddy 自动申请 HTTPS 证书需要满足：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;域名已经解析到服务器公网IP；&lt;/li&gt;
&lt;li&gt;服务器安全组已开放80和443端口；&lt;/li&gt;
&lt;li&gt;80/443端口没有被其他服务使用/占用；&lt;/li&gt;
&lt;li&gt;CA 可以访问服务器。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DNS:

example.com

A记录:

example.com -&amp;gt; 服务器公网 IP
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Caddy 单域名多服务配置&lt;/h2&gt;
&lt;h3&gt;创建 Caddyfile&lt;/h3&gt;
&lt;p&gt;Caddy 使用名为：&lt;code&gt;Caddyfile&lt;/code&gt;的配置文件。&lt;/p&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件&lt;strong&gt;没有扩展名&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;默认位置通常为 &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;touch Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;单服务反向代理示例&lt;/h3&gt;
&lt;p&gt;假设：&lt;/p&gt;
&lt;p&gt;后端应用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1:8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;FastAPI：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uvicorn main:app --host 127.0.0.1 --port 8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caddyfile：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy 127.0.0.1:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;单应用静态文件服务示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    root * /var/www/html
    file_server
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;单域名静态文件 + 反向代理配置方式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy 127.0.0.1:8000

    root * /var/www/html
    file_server
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种配置虽然可以运行，但是由于反向代理和静态文件服务处于同一个请求处理链中，随着项目增加路由规则，容易产生请求匹配问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐使用&lt;code&gt;handle&lt;/code&gt;明确划分不同请求&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    handle /api/* {
        reverse_proxy 127.0.0.1:8000
    }

    handle {
        root * /var/www/html
        file_server
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果后端接口统一增加&lt;code&gt;/api&lt;/code&gt;前缀，例如&lt;code&gt;/api/user&lt;/code&gt;，
那么前端请求地址也需要同步调整为&lt;code&gt;https://example.com/api/user&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;此时，访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://example.com/api/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将代理到后端接口。&lt;/p&gt;
&lt;p&gt;而访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;则是静态资源页面。&lt;/p&gt;
&lt;p&gt;这种方式可以使用，但随着项目复杂度增加，路由规则会逐渐变复杂。&lt;/p&gt;
&lt;h3&gt;单域名部署前后端分离项目推荐方案&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    root * /var/www/html
    file_server
}

api.example.com {
    reverse_proxy 127.0.0.1:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时，访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://api.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将代理到后端接口。&lt;/p&gt;
&lt;p&gt;而访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;则是静态资源页面。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;同样，前端项目中的API请求地址需要配置为&lt;code&gt;https://api.example.com&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Caddy 服务管理&lt;/h2&gt;
&lt;h2&gt;检查配置&lt;/h2&gt;
&lt;p&gt;修改&lt;code&gt;Caddyfile&lt;/code&gt;后，建议先验证配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;caddy validate --config /etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以选择格式化配置文件（非必要）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;caddy fmt --overwrite /etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认无误后重新加载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;caddy reload --config /etc/caddy/Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Linux systemd&lt;/h3&gt;
&lt;p&gt;启动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl start caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl status caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开机启动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新加载配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl reload caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Docker Compose 部署 Caddy&lt;/h2&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: always
    ports:
      - &quot;80:80&quot;
      - &quot;443:443&quot;
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./data:/data
      - ./config:/config
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;/data&lt;/code&gt;目录用于保存 Caddy 自动申请的证书和状态信息，生产环境不要删除，否则可能触发重新申请证书。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;启动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;Caddy 为什么不用手动配置 SSL？&lt;/h3&gt;
&lt;p&gt;因为 Caddy 内置 ACME 协议支持，可以自动完成证书申请和续签。&lt;/p&gt;
&lt;h3&gt;Caddy 可以代理 Docker 容器吗？&lt;/h3&gt;
&lt;p&gt;可以。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy app:8000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;code&gt;app&lt;/code&gt;是 Docker Compose 服务名。Caddy 需要与后端服务同属一个网络组内。&lt;/p&gt;
&lt;h3&gt;Caddy 和 Nginx 可以一起使用吗？&lt;/h3&gt;
&lt;p&gt;可以。 不过大多数个人项目没有必要。&lt;/p&gt;
&lt;h3&gt;Caddy 支持泛域名证书吗？&lt;/h3&gt;
&lt;p&gt;支持。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是泛域名证书需要 DNS Challenge。&lt;/p&gt;
&lt;h3&gt;Caddy 权限错误怎么办？&lt;/h3&gt;
&lt;p&gt;如果执行 Caddy 命令出现：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;permission denied
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通常是权限不足导致的。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;检查当前用户是不是&lt;code&gt;root&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;whoami
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不是&lt;code&gt;root&lt;/code&gt;，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo &amp;lt;command&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;确保当前用户拥有读取权限&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ls -l Caddyfile

# 如果当前用户没有权限，修改所有者
chown $USER:$USER Caddyfile

# 设置权限
chmod 644 Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Caddy 是一个简单、高效、现代化的 Web 服务器。&lt;/p&gt;
&lt;p&gt;相比传统 Nginx，Caddy 最大优势是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置简单；&lt;/li&gt;
&lt;li&gt;自动 HTTPS；&lt;/li&gt;
&lt;li&gt;自动证书续签；&lt;/li&gt;
&lt;li&gt;原生支持 HTTP/3；&lt;/li&gt;
&lt;li&gt;非常适合个人项目和中小型服务部署。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于 FastAPI、React、Astro、Docker 等现代技术栈，使用 Caddy 可以减少服务器运维成本，让开发者更加关注业务代码。&lt;/p&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;p&gt;本文内容参考以下官方文档和标准资料：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/&quot;&gt;Caddy 官方文档&lt;/a&gt;：Caddy 官方文档详细介绍了 Caddy 的安装、配置、反向代理、自动
HTTPS 等功能。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com.cn/docs/&quot;&gt;Caddy 官方中文文档&lt;/a&gt;：提供 Caddy 官方文档的中文翻译站点，提供中文化阅读体验。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/caddyserver/caddy&quot;&gt;Caddy 官方 GitHub 仓库&lt;/a&gt;：Caddy 是一个基于 Go 语言开发的开源
Web 服务器，其源码托管于 GitHub。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.org/docs/&quot;&gt;Let&apos;s Encrypt 官方文档&lt;/a&gt;：Let&apos;s Encrypt 是目前广泛使用的免费
TLS 证书颁发机构（CA）。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8555&quot;&gt;ACME 协议标准（RFC 8555）&lt;/a&gt;：ACME（Automatic Certificate
Management Environment）定义了自动化申请和管理 TLS 证书的标准流程。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9114&quot;&gt;HTTP/3 标准（RFC 9114）&lt;/a&gt;：HTTP/3 基于 QUIC 协议，是现代 Web
网络协议的重要发展方向。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item></channel></rss>