开源项目
caddyserver/caddy avatar
caddyserver/caddy

Caddy 2.11:默认 HTTPS 的 Go 语言 Web 服务器,配置简单但扩展有代价

具有自动 HTTPS 功能的快速且可扩展的多平台 HTTP/1-2-3 Web 服务器

75,760 个 Star4,962 个 ForkGoApache-2.0

秒懂

它是什么?
Caddy 是一个用 Go 编写的 HTTP/1-2-3 Web 服务器,默认启用自动 HTTPS。它用 Caddyfile 或 JSON 配置,适合中小型站点,但插件扩展需要额外构建工具。
适合谁用?
Caddy 适合需要快速启用 HTTPS、不想手动管理证书的个人站长、中小型团队,以及偏好声明式配置的开发者。它不适合需要深度定制 TLS 行为、依赖特定插件生态、或必须使用系统包管理器部署的企业环境。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 1 天前。
用什么语言写的?
主要是 Go(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

默认 HTTPS 的服务器,解决证书管理的痛点

Caddy 是一个用 Go 编写的 Web 服务器,支持 HTTP/1.1、HTTP/2 和 HTTP/3。它最核心的卖点是自动 HTTPS:只要配置了域名,Caddy 会自动从 ZeroSSL 或 Let's Encrypt 申请证书,并管理续期。对于内部名称和 IP,它还能使用本地 CA。这意味着你不需要像配置 Nginx 那样手动指定证书路径、设置续期脚本。它的目标用户是那些不想被 TLS 证书生命周期困扰的开发者,以及需要快速部署多个站点的运维人员。README 中提到它“为公共名称提供 ZeroSSL 和 Let's Encrypt,为内部名称和 IP 提供完全托管的本地 CA”,这直接点明了它解决的问题:证书获取和续期通常是最容易出错的部分。

Caddyfile 与 JSON 双轨配置,适配不同习惯

Caddy 提供两种配置方式:一种是简洁的 Caddyfile,适合手写;另一种是原生 JSON 配置,适合程序化生成。JSON 配置还可以通过 HTTP API 动态更新,这意味着你可以在不重启进程的情况下修改服务器行为。此外,Caddy 支持“配置适配器”,如果你不喜欢 JSON,可以用其他格式转换。这种双轨设计在 Web 服务器中并不常见。Nginx 只有静态文件配置,而 Caddy 的 JSON API 为自动化运维提供了可能。但要注意,Caddyfile 的简洁性是以牺牲灵活性为代价的,复杂的路由规则或中间件逻辑在 JSON 中会更冗长。README 强调“易配置”和“强大配置”并存,但实际使用时你需要决定走哪条路。

模块化架构:扩展靠编译,而不是运行时加载

Caddy 的扩展方式不是插件目录或动态库,而是通过 Go 的 import 机制在编译时加入。官方提供的 xcaddy 工具可以自动化这个过程:它会复制 Caddy 的 main.go,添加你想要的插件 import,然后编译出新的二进制。README 给出了具体步骤:用 xcaddy build,它会自动创建目录、初始化 Go module、添加插件 import,最后用 go build -tags=nobadger,nomysql,nopgx 编译。这意味着每次添加插件你都需要重新编译一次。这是一个明显的权衡:优点是最终二进制没有外部依赖,甚至不需要 libc,运行环境极其干净;缺点是升级 Caddy 或插件时,你必须重复整个构建流程。对于不熟悉 Go 工具链的用户,这会是一个门槛。

从源码构建的坑:版本信息与权限问题

如果你直接从 GitHub 克隆源码,在 cmd/caddy 目录下执行 go build,得到的二进制不会包含正确的版本信息。README 明确警告了这一点,并建议使用 xcaddy 或官方发布版。另外,Caddy 默认绑定低端口(如 80 和 443),在 Linux 上需要 root 权限。README 给出了解决方案:用 sudo setcap cap_net_bind_service=+ep ./caddy 赋予二进制绑定低端口的权限,或者用 go run -exec ./setcap.sh main.go 运行。这些细节说明,从源码构建虽然可行,但并不是开箱即用的体验。如果你只是想要一个能跑的服务器,直接下载官方 release 二进制更省事。

生产环境声称与实际限制

README 声称 Caddy“在生产中服务了数万亿请求,管理了数百万 TLS 证书”,并且“可以扩展到数十万个站点”。这些数字来自项目方,我们无法独立验证,但至少说明设计目标是大规模。然而,Caddy 的模块化架构在扩展时可能会遇到问题:默认构建包含的模块有限,如果你需要数据库驱动或特定认证插件,必须自己用 xcaddy 编译。这可能导致二进制体积增大,且升级时需要重新测试所有插件兼容性。另一个限制是,虽然 Caddy 支持 HTTP/3,但它的配置项和调优参数相比 Nginx 或 Apache 更少,深度优化场景下可能不够灵活。如果你需要精细控制 TCP 栈或 worker 进程模型,Caddy 可能不是最佳选择。

与 Nginx 的对比:配置哲学不同

Nginx 是 Caddy 最常见的替代品。Nginx 使用静态配置文件,通过信号或 reload 命令重载,不支持运行时 API。它的扩展通过第三方模块实现,但模块通常需要与 Nginx 版本严格匹配,编译安装过程繁琐。Caddy 的 JSON API 和配置适配器提供了动态更新的能力,这是 Nginx 没有的。但 Nginx 的配置语法更贴近传统运维习惯,社区资料和现成配置片段更多。Caddy 的 Caddyfile 虽然简单,但如果你需要迁移现有 Nginx 配置,需要重新学习规则。另一个区别是 Nginx 默认不处理 TLS 证书,你需要额外配置 certbot 等工具;Caddy 则把证书管理内置了。选择哪个,取决于你更在意配置的灵活性还是运维的自动化。

维护与升级成本:版本迭代频繁

Caddy 的发布节奏相当活跃,最近版本是 v2.11.4(2026-06-03),紧接着 v2.11.3(2026-05-12)和 v2.11.2(2026-03-06)。这意味着每两个月左右就有一次更新。对于使用官方二进制的用户,升级就是替换文件;但如果你用 xcaddy 编译了自定义插件,每次升级都需要重新执行构建流程,并验证插件兼容性。Caddy 的许可证是 Apache-2.0,允许自由使用和修改,但如果你分发修改后的二进制,需要保留版权声明。没有看到关于长期支持版本的信息,所以生产环境升级前最好在测试环境验证。总体而言,维护成本取决于你依赖多少自定义插件,官方核心的升级相对平滑。

编辑结论

Caddy 适合需要快速启用 HTTPS、不想手动管理证书的个人站长、中小型团队,以及偏好声明式配置的开发者。它不适合需要深度定制 TLS 行为、依赖特定插件生态、或必须使用系统包管理器部署的企业环境。采用前先验证三点:确认你的 Go 版本满足 1.25.0 或更高,检查所需插件是否在 xcaddy 构建流程中可用,以及评估 JSON API 的动态配置是否满足你的自动化需求。Caddy 的默认 HTTPS 和零外部依赖是实实在在的优势,但它的扩展模型要求你接受额外的构建步骤,这是你做出决定前必须权衡的代价。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记