Caddy:拥有 72K+ 星的生产 Web 服务器 — 2026 自动 HTTPS 部署指南

Caddy (Caddyserver) is a fast, extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS. Compatible with Docker, Let''s Encrypt, Prometheus, and Grafana. Covers Caddyfile tutorial, Docker setup, production hardening, and monitoring.

  • Apache-2.0
  • 更新于 2026-05-19

{{< 资源信息 >}} Caddy 是唯一将 HTTPS 视为默认设置而不是事后添加的渠道 Web 服务器。 虽然 Nginx 需要手动证书配置,Apache 需要 mod_ssl 整理,但 Caddy 自动从 Let’s Encrypt 和 ZeroSSL 提供和更新 TLS 证书 — 没有 cron 作业,没有 certbot,不需要配置。 凭借 72,595 个 GitHub star 和用 Go 编写的代码库,Caddy 已在生产环境中处理数千个请求并管理数百万个 TLS 证书,从单个 VPS 部署到处理多个节点的集群。 本 Caddy 教程 介绍了生产级部署。 您将学习架构、编写真正的 Caddyfile 配置、与 Caddy Docker 设置和监控堆栈集成,并在 Caddy 与 Nginx 比较中查看硬基准测试数据。 所有命令和配置均在带有 Caddy 2.x 的 Ubuntu 24.04 LTS 上进行测试。 ## 什么是球童? Caddy 是一个用Go编写的开源、跨平台Web服务器和反向代理。 它最初支持 HTTP/1.1、HTTP/2 和 HTTP/3,并自动为所有配置的域启用 HTTPS,无需手动证书管理。 Caddy 使用称为 Caddyfile(或用于编程控制的 JSON)的配置格式,并作为零外部依赖的单个静态二进制文件运行 - 甚至不是 libc。 该项目由 Matt Holt 于 2015 年创建,Caddy 2.0 于 2020 年发布,并围绕默认的、基于插件的架构进行了完全重写。 它需要自动TLS配置和零配置重新加载SaaS平台、政府机构和内容交付网络以用于生产。 ## 球童的工作原理 Caddy 的架构与传统的基于 C 的服务器有根本的不同。 了解这些内部结构有利于调整布置生产。

Caddy Web 服务器官方源码
显示自动 HTTPS 流程的 Caddy 架构图
### 核心架构 Caddy 构建在中间件链架构之上。 每个结构请求都会流经配置中定义的一系列HTTP处理程序 - 日志记录、身份验证、反向代理、静态文件服务、错误处理等。 每个处理程序都可以修改请求、生成响应或将请求发送给链中的下一个处理程序。 服务器使用 Go 的 goroutine 调度程序,而不是传统的事件循环或每个连接处理模型。 每个 HTTP 请求都有自己的 goroutine,这意味着: - 内存调整进程(无“worker_processes”可指令) - 内存请求处理通过 GOMAXPROCS 自动扩展 - 每个连接的内存与 Nginx 的事件循环,但更容易推理 ### 自动 HTTPS 内部结构 当 Caddy 在其配置中使用域名启动时,它会自动执行以下步骤: 1. ACME客户端激活:Caddy的内置ACME客户端联系Let’s Encrypt(主要)和ZeroSSL(后备) 2. 域验证:HTTP-01 或 TLS-ALPN-01 质询兑换域聊天室 3. 颁发证书:获取TLS证书并存储在$HOME/.local/share/caddy/data中 4. OCSP 装订:自动获取证书状态并将其装订到 TLS 握手 5. 续订监控:后台goroutine检查过渡情况并在过渡前60天进行续订 6. HTTP 到 HTTPS 重定向:端口 80 流量自动重定向到端口 443 整个管道需要零配置。 运营商只指定域名。 ### JSON配置API Caddy在接受JSON配置的“localhost:2019”上公开了RESTful管理API。 这可以实现动态更改,而重新启动配置,并为“caddy-docker-proxy”插件提供支持,以实现自动 Docker 服务发现。 ````重击

获取当前运行配置卷曲 http://localhost:2019/config/ # 动态应用新配置curl -X POST http://localhost:2019/config/apps/http/servers/srv0/routes \ -H“内容类型:application/json”\ -d ‘{“handle”: [{“handler”: “static_response”, “body”: “OK”}]}’ ## 在任何平台上运行 Caddy 的安装和设置都需要不到五分钟的时间。 本**Caddy设置**指南介绍了**自动HTTPS服务器**裸机和容器化部署的工作流程。 ### 通过官方存储库安装(推荐) #

bas h #安装需要的包 sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https # 添加 Caddy 官方 GPG 外部卷曲 -1sLf ‘https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | \ sudo gpg –dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg # 添加存储库卷曲 -1sLf ‘https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \ sudo tee /etc/apt/sources.list.d/caddy-stable.list # 安装球童 须藤 apt 更新 sudo apt 安装球童 #检查版本 球童版 ### 通过 Docker 安装 yam l

文件:docker-compose.yml 服务: 球童: 图片:球童:2-alpine 容器名称:球童 重新启动:免停止 端口: - “80:80” - “443:443” - “443:443/udp” # HTTP/3 QUIC 卷: - ./Caddyfile:/etc/caddy/Caddyfile -球童数据:/数据 - caddy_config:/配置 - ./site:/usr/share/caddy 网络: - 球童网络 卷: 球童数据: 球童配置: 网络: 球童网络: 名称:caddy_network 司机:桥 ````````重击 #

启动容器 docker 组成 -d #检查日志 docker compose 日志 -f 球童 ```` ###第一个 Caddyfile — 静态站点``球童 #文件:Caddyfile 示例.com { 根* /usr/share/caddy 文件服务器编码 gzip # 安全标头 标头{ 严格传输安全“max-age=31536000;includeSubDomains;预加载” X-Content-Type-Options“nosniff” X 帧选项“DENY” 推荐人策略“跨源时严格源” } } ````````重击 #

验证配置 caddy 验证 –config /etc/caddy/Caddyfile # 零一次重新加载 caddy 重新加载 –config /etc/caddy/Caddyfile ### Systemd 服务配置 #

in i

文件:/etc/systemd/system/caddy.service [单位] 描述=Caddy Web 服务器文档=https://caddyserver.com/docs/ After=network.target 网络在线.target 需要=网络在线.target [服务] 类型=通知用户=球童 组=球童 ExecStart=/usr/bin/caddy 运行 –environ –config /etc/caddy/Caddyfile ExecReload=/usr/bin/caddy reload –config /etc/caddy/Caddyfile –force 停止超时秒=5s 限制NOFILE=131072 NPROC=65535 PrivateTmp=true 保护系统=完整环境能力=CAP_NET_BIND_SERVICE [安装] WantedBy=多用户.target ````````重击 #

启用并启动 sudo systemctl 监控进程重新加载 sudo systemctl 启用–现在球童 sudo systemctl 状态球童 ## 与 Docker、Prometheus、Grafana 和 Let's Encrypt 集成 ### 使用 Docker Compose 进行多站点反向代理 最常见的生产设置使用 Caddy 作为多个容器化应用程序的反向代理。 #

yam l

文件:docker-compose.yml 服务: 球童: 图片:球童:2-alpine 容器名称:球童 重新启动:免停止 端口: - “80:80” - “443:443” - “443:443/udp” 卷数: - ./Caddyfile:/etc/caddy/Caddyfile -球童数据:/数据 - caddy_config:/配置 网络: - 代理环境: - ACME_同意=真应用编程接口: 图片:my-api:最新重新启动:投票停止 网络: - 代理人公告: - “8080” 前端: 图片:我的前端:最新重新启动:不用停止 网络: - 代理人公告: - “3000” 普罗米修斯: 图片:舞会/普罗米修斯:最新容器名称:普罗米修斯 重新启动:不需要停止 卷: - ./prometheus.yml:/etc/prometheus/prometheus.yml - 普罗米修斯数据:/普罗米修斯 端口: - “9090:9090” 网络: - 代理人格拉法纳: 图片:grafana/grafana-oss:最新容器名称:grafana 重新启动:飞行停止 卷: - grafana_data:/var/lib/grafana 端口: - “3000:3000” 网络: - 代理卷: 球童数据: 球童配置: 普罗米修斯数据: 普罗米修斯数据: 网络: 代理: 名称:代理司机:桥 `````` 球童 #文件:Caddyfile { # 全局选项 auto_https off # 如果位于另一个 LB 后面则取消,保持直接打开 admin off # 在中取消管理 API,或限制访问 # 启用普罗米修斯指标服务器{ 指标 } } # API耳机限制 api.example.com { 反向代理 API:8080 # 启用压缩编码 gzip zstd # 速率(需要http.rate_limit模块) 速率限制{ 区域 static_api { 关键静态活动 100 窗1m } } # CORS 标头 标头{ 访问控制允许来源“https://app.example.com” 访问控制允许方法“GET、POST、PUT、DELETE、OPTIONS” 访问控制允许标头“内容类型,授权”} } # 前端应用程序.example.com { 反向代理前置:3000 编码 gzip zstd # 安全标头 标头{ 严格传输安全“max-age=31536000;includeSubDomains” X-Content-Type-Options“nosniff” X 框架选项“SAMEORIGIN” 内容安全策略“default-src ‘self’; script-src ‘self’ ‘unsafe-inline’” } } # Prometheus — 限制内部访问 prometheus.example.com { @内部的 { IP 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 } 处理@内部{ 反向代理普罗米修斯:9090 } 处理 { 回复“禁止”403 } } # 格拉法纳 grafana.example.com { 反向格拉法纳 grafana.example.com { 反向格拉法纳:3000 } ### Prometheus 抽取配置 #

yam l #文件:prometheus.yml 全球:刮擦间隔:15s 评估间隔:15s scrap_configs: - 工作名称:‘球童’ 静态配置: - 目标:[‘球童:2019’] 指标路径:/指标 - job_name: ‘节点导出器’ 静态配置: - 目标:[‘节点导出器:9100’] ### 多机场 SaaS 的介入 TLS 对于动态服务客户子域的平台,Caddy 支持介入 TLS — 首次请求域时获取证书。 ``球童 #文件:Caddyfile { 点播_tls { 询问http://localhost:8080/allow间隔2m爆发5 } } *.customers.example.com { tls {一经请求 } 逆向代理应用程序:3000 } ````````蟒蛇#文件:app/allow_endpoint.py(Flask示例) 从烧瓶导入烧瓶,请求,jsonify应用程序=烧瓶(__名称__) ALLOWED_DOMAINS = {"alice", "bob", "charlie"} #来自生产中的数据库加载 @app.route("/允许") def check_domain(): 域 = request.args.get("", "") 域子域名=domain.replace(".customers.example.com", "") 如果子域位于 ALLOWED_DOMAINS 中:返回“确定”,200 返回“允许”,403 如果 __name__ == "__main__": app.run(主机=“0.0.0.0”,端口=8080) ##基准/实际示例2025年11月至2026年4月期间发布的独立基准测试活动揭示了Caddy的优势存在以及存在的权衡之处。 ### 静态文件服务性能 | 基准工作负载| 球童2.8 | Nginx 1.26 | Nginx 1.26 Nginx 1.26 Nginx 1.26 破解者 | Nginx 1.26 Nginx 1.26 | Nginx 1.26

💬 留言讨论