云计算百科
云计算领域专业知识百科平台

一天一个开源项目(第46篇):Caddy - 自动 HTTPS 的现代化 Web 服务器,支持 HTTP/3

引言

“Every site on HTTPS”

这是「一天一个开源项目」系列的第 46 篇文章。今天介绍的项目是 Caddy(GitHub)。

还在为配置 HTTPS 证书而烦恼?还在使用 Nginx 或 Apache 的复杂配置?Caddy 是一个用 Go 编写的快速、可扩展的多平台 Web 服务器,默认自动 HTTPS,支持 HTTP/1.1、HTTP/2、HTTP/3,零配置即可使用,适合生产环境。自 2014 年发布以来,已服务数万亿 HTTPS 请求,管理数百万 TLS 证书,是第一个默认使用 HTTPS 的 Web 服务器。

为什么值得看?

  • 🚀 自动 HTTPS:默认启用,自动管理 TLS 证书(Let’s Encrypt、ZeroSSL)
  • 🌐 HTTP/3 支持:默认支持 HTTP/1.1、HTTP/2、HTTP/3
  • ⚡ 高性能:Go 编写,单二进制文件,无外部依赖
  • 🔧 易配置:Caddyfile 简单配置,JSON API 动态配置
  • 🛡️ 生产就绪:已服务数万亿请求,管理数百万证书
  • 🔌 高度可扩展:模块化架构,丰富的插件生态
  • 📦 零依赖:单静态二进制文件,甚至不需要 libc

你将学到什么

  • Caddy 的核心特性:自动 HTTPS、HTTP/3、反向代理
  • Caddyfile 配置语法和 JSON API 配置
  • 与 Nginx、Apache 的对比和优势
  • 实际使用场景:静态网站、反向代理、API 网关
  • 插件系统和扩展机制
  • 生产环境部署最佳实践

前置知识

  • 了解 Web 服务器基本概念(HTTP、HTTPS、反向代理)
  • 对 TLS/SSL 证书有基本了解
  • 了解 Go 语言(可选,用于理解实现)
  • 对 Nginx 或 Apache 有使用经验(可选,便于对比)

项目背景

项目简介

Caddy 是一个用 Go 编写的快速、可扩展的多平台 Web 服务器,最突出的特点是默认自动 HTTPS。它是第一个默认使用 HTTPS 的 Web 服务器,让 HTTPS 成为标准而非选项。

核心特点:

  • 自动 HTTPS:默认启用,自动从 Let’s Encrypt 或 ZeroSSL 获取证书
  • HTTP/3 支持:默认支持 HTTP/1.1、HTTP/2、HTTP/3
  • 零配置:最简单的配置即可运行
  • 高性能:Go 编写,单二进制文件,无外部依赖
  • 生产就绪:已服务数万亿请求,管理数百万证书
  • 高度可扩展:模块化架构,丰富的插件生态
  • 动态配置:支持 JSON API 在线配置更改
  • 多平台:支持 Linux、macOS、Windows

解决的核心问题:

  • HTTPS 配置复杂,证书管理繁琐
  • 传统 Web 服务器配置复杂,学习曲线陡峭
  • HTTP/3 支持需要额外配置
  • 证书过期导致服务中断
  • 多站点管理复杂

面向的用户:

  • 需要快速部署 HTTPS 网站的开发者
  • 需要简化 Web 服务器配置的运维人员
  • 需要 HTTP/3 支持的应用
  • 需要反向代理和负载均衡的团队
  • 希望零配置使用 HTTPS 的个人开发者

作者/团队介绍

  • 作者:Matthew Holt(@mholt6)
  • 背景:2014 年在杨百翰大学学习计算机科学时开始开发 Caddy
  • 理念:让 HTTPS 成为标准,简化 Web 服务器配置
  • 项目归属:ZeroSSL(HID Global 公司)的项目
  • 社区:数百名贡献者,活跃的社区支持

项目名称由来: “Caddy” 这个名字的由来是因为这个软件帮助处理 Web 服务的繁琐、平凡任务,也是多个东西组织在一起的单一场所(就像高尔夫球童 caddy 一样)。

项目数据

  • ⭐ GitHub Stars: 70.8k+
  • 🍴 Forks: 4.7k+
  • 📦 版本: v2.11.2(持续更新中,2,505+ commits)
  • 📄 License: Apache-2.0
  • 🌐 官网: caddyserver.com
  • 📚 文档: caddyserver.com/docs
  • 💬 社区: caddy.community
  • 🐛 Issues: GitHub Issues

技术栈:

  • 语言: Go(97.9%)
  • 核心特性: HTTP/1.1、HTTP/2、HTTP/3、TLS、自动证书管理
  • 依赖: CertMagic(自动证书管理库)
  • 平台: Linux、macOS、Windows

重要里程碑:

  • 2014 年:项目启动,第一个默认 HTTPS 的 Web 服务器
  • 2020 年:Caddy 2.0 发布,完全重写
  • 2021 年:Caddy 2.6 默认启用 HTTP/3
  • 至今:已服务数万亿 HTTPS 请求,管理数百万证书

主要功能

核心作用

Caddy 的核心作用是:提供一个现代化、易用的 Web 服务器,让开发者能够:

  • 零配置 HTTPS:自动获取和管理 TLS 证书
  • 高性能服务:支持 HTTP/1.1、HTTP/2、HTTP/3
  • 反向代理:灵活的反向代理和负载均衡
  • 静态文件服务:高效的静态文件服务器
  • 动态配置:通过 JSON API 在线更改配置
  • 多站点管理:轻松管理数百个站点
  • 插件扩展:丰富的插件生态
  • 使用场景

  • 静态网站托管

    • 个人博客、文档网站
    • 单页应用(SPA)部署
    • 静态资源 CDN
  • 反向代理

    • 微服务 API 网关
    • 负载均衡
    • 服务发现集成
  • 开发环境

    • 本地 HTTPS 开发
    • 自动证书管理
    • 快速原型部署
  • 生产环境

    • 高可用 Web 服务
    • 多站点管理
    • 自动证书续期
  • 容器化部署

    • Docker 容器
    • Kubernetes Ingress
    • 云原生应用
  • 快速开始

    安装:

    # macOS
    brew install caddy

    # Linux(使用包管理器)
    sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg –dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
    sudo apt update
    sudo apt install caddy

    # 或直接下载二进制文件
    wget https://github.com/caddyserver/caddy/releases/latest/download/caddy_2.11.2_linux_amd64.tar.gz
    tar -xzf caddy_2.11.2_linux_amd64.tar.gz
    sudo mv caddy /usr/local/bin/

    最简单的配置(Caddyfile):

    # 自动 HTTPS,零配置
    localhost

    respond "Hello, Caddy!"

    运行:

    # 使用 Caddyfile
    caddy run

    # 或指定配置文件
    caddy run –config Caddyfile

    # 后台运行
    caddy start –config Caddyfile

    访问:

    • HTTP: http://localhost:2015
    • HTTPS: https://localhost(自动证书)

    反向代理示例:

    example.com {
    reverse_proxy localhost:8080
    }

    静态文件服务:

    example.com {
    root * /var/www/html
    file_server
    }

    核心特性

  • 自动 HTTPS

    • 默认启用 HTTPS
    • 自动从 Let’s Encrypt 或 ZeroSSL 获取证书
    • 自动续期,无需手动管理
    • 支持内部名称和 IP 的本地 CA
    • 多证书颁发机构回退
  • HTTP/3 支持

    • 默认支持 HTTP/1.1、HTTP/2、HTTP/3
    • 基于 QUIC 协议
    • 自动降级(UDP 不可用时回退到 HTTP/2)
    • 向后兼容
  • 灵活的配置

    • Caddyfile:简单易读的配置语法
    • JSON API:原生 JSON 配置,动态更新
    • 配置适配器:支持 YAML、TOML、NGINX 配置格式
    • 在线配置更改:无需重启,优雅重载
  • 反向代理

    • 灵活的路由规则
    • 负载均衡(轮询、最少连接、IP 哈希等)
    • 健康检查
    • 服务发现集成(Consul、Kubernetes 等)
    • WebSocket 支持
  • 静态文件服务

    • 高效的文件服务器
    • 目录浏览
    • 文件压缩(gzip、brotli)
    • 缓存控制
    • 范围请求支持
  • 安全特性

    • TLS 1.3 支持
    • OCSP Stapling
    • HSTS 支持
    • 安全头部自动设置
    • 防止 TLS/OCSP/证书相关问题导致服务中断
  • 可扩展性

    • 模块化架构
    • 丰富的插件生态
    • 自定义中间件
    • 插件热加载
  • 生产就绪

    • 已服务数万亿请求
    • 管理数百万证书
    • 支持数十万站点
    • 高可用性设计
    • 完善的监控和日志
  • 项目优势

    对比项CaddyNginxApache
    HTTPS 配置 ✅ 自动,零配置 ⚠️ 需手动配置证书 ⚠️ 需手动配置证书
    HTTP/3 支持 ✅ 默认启用 ⚠️ 需额外模块 ⚠️ 需额外模块
    配置复杂度 ✅ Caddyfile 简单 ⚠️ 配置文件复杂 ⚠️ 配置文件复杂
    动态配置 ✅ JSON API,无需重启 ⚠️ 需重载配置 ⚠️ 需重载配置
    证书管理 ✅ 自动续期 ❌ 需手动管理 ❌ 需手动管理
    性能 ✅ Go 编写,高性能 ✅ C 编写,高性能 ⚠️ 进程模型,性能一般
    内存安全 ✅ Go 内存安全保证 ⚠️ C 语言,需注意 ⚠️ C 语言,需注意
    依赖 ✅ 单二进制,无依赖 ⚠️ 需系统库 ⚠️ 需系统库
    学习曲线 ✅ 简单,快速上手 ⚠️ 陡峭 ⚠️ 陡峭
    插件生态 ✅ 丰富的插件 ✅ 丰富的模块 ✅ 丰富的模块

    为什么选择 Caddy?

    • 零配置 HTTPS:自动获取和管理证书,无需手动操作
    • 现代化协议:默认支持 HTTP/3,面向未来
    • 简单配置:Caddyfile 语法简单,JSON API 灵活
    • 生产就绪:已服务数万亿请求,管理数百万证书
    • 高度可扩展:模块化架构,丰富的插件生态
    • 单二进制:无外部依赖,易于部署
    • 内存安全:Go 语言编写,内存安全保证

    项目详细剖析

    架构设计

    Caddy 采用模块化、可扩展的架构设计,基于 Go 语言,通过模块系统实现功能扩展。

    核心组件:

    Caddy
    ├── HTTP App(HTTP 服务器)
    │ ├── HTTP/1.1 支持
    │ ├── HTTP/2 支持
    │ └── HTTP/3 支持(QUIC)
    ├── TLS App(TLS 管理)
    │ ├── 自动证书获取(CertMagic)
    │ ├── 证书续期
    │ └── OCSP Stapling
    ├── 反向代理模块
    │ ├── 路由规则
    │ ├── 负载均衡
    │ └── 健康检查
    ├── 静态文件服务器
    ├── 中间件系统
    │ ├── 认证
    │ ├── 压缩
    │ ├── 日志
    │ └── 缓存
    └── 配置系统
    ├── Caddyfile 解析器
    ├── JSON API
    └── 配置适配器

    设计理念:

  • 默认安全:HTTPS 默认启用,安全优先
  • 零配置:最简单的配置即可运行
  • 模块化:功能通过模块实现,易于扩展
  • 动态配置:支持在线配置更改,无需重启
  • 单二进制:无外部依赖,易于部署
  • 自动 HTTPS 实现

    Caddy 的自动 HTTPS 功能基于 CertMagic 库实现,支持多种证书颁发机构。

    工作流程:

    1. 首次请求 HTTPS

    2. 检查本地是否有有效证书

    3. 如果没有,向 Let's Encrypt 或 ZeroSSL 申请

    4. 完成 ACME 挑战(HTTP-01、DNS-01、TLS-ALPN-01)

    5. 获取证书并存储

    6. 自动续期(证书到期前 30 天)

    支持的证书颁发机构:

    • Let’s Encrypt:公开域名
    • ZeroSSL:公开域名
    • 本地 CA:内部名称和 IP
    • 自定义 CA:支持自定义证书颁发机构

    ACME 挑战类型:

    • HTTP-01:通过 HTTP 验证域名所有权
    • DNS-01:通过 DNS 记录验证
    • TLS-ALPN-01:通过 TLS 握手验证

    配置示例:

    # 自动 HTTPS(默认)
    example.com {
    respond "Hello, HTTPS!"
    }

    # 使用特定邮箱(Let's Encrypt)
    example.com {
    email admin@example.com
    respond "Hello, HTTPS!"
    }

    # 禁用自动 HTTPS
    example.com {
    http_only
    respond "Hello, HTTP!"
    }

    HTTP/3 支持

    Caddy 2.6+ 默认启用 HTTP/3 支持,基于 QUIC 协议。

    HTTP/3 特性:

    • 基于 QUIC:使用 UDP 传输,而非 TCP
    • 多路复用:无队头阻塞
    • 连接迁移:IP 地址变化时保持连接
    • 0-RTT:快速建立连接

    自动降级:

    HTTP/3 (QUIC/UDP)
    ↓ (UDP 不可用)
    HTTP/2 (TCP)
    ↓ (HTTP/2 不可用)
    HTTP/1.1 (TCP)

    配置:

    # HTTP/3 默认启用,无需配置
    example.com {
    respond "Hello, HTTP/3!"
    }

    # 显式启用 HTTP/3
    example.com {
    protocols h1 h2 h3
    respond "Hello, HTTP/3!"
    }

    # 禁用 HTTP/3
    example.com {
    protocols h1 h2
    respond "Hello, HTTP/2!"
    }

    配置系统

    Caddy 支持多种配置方式,从简单的 Caddyfile 到灵活的 JSON API。

    Caddyfile 语法:

    # 全局选项
    {
    email admin@example.com
    admin localhost:2019
    }

    # 站点配置
    example.com {
    # 反向代理
    reverse_proxy localhost:8080

    # 静态文件
    root * /var/www/html
    file_server

    # 日志
    log {
    output file /var/log/caddy/access.log
    }

    # 压缩
    encode gzip zstd

    # 安全头部
    header {
    Strict-Transport-Security "max-age=31536000;"
    X-Content-Type-Options "nosniff"
    }
    }

    JSON API 配置:

    {
    "apps": {
    "http": {
    "servers": {
    "srv0": {
    "listen": [":443"],
    "routes": [
    {
    "match": [
    {
    "host": ["example.com"]
    }
    ],
    "handle": [
    {
    "handler": "reverse_proxy",
    "upstreams": [
    {
    "dial": "localhost:8080"
    }
    ]
    }
    ]
    }
    ]
    }
    }
    },
    "tls": {
    "automation": {
    "policies": [
    {
    "subjects": ["example.com"],
    "issuers": [
    {
    "module": "acme",
    "email": "admin@example.com"
    }
    ]
    }
    ]
    }
    }
    }
    }

    动态配置:

    # 通过 API 加载配置
    curl -X POST http://localhost:2019/load \\
    -H "Content-Type: application/json" \\
    -d @config.json

    # 获取当前配置
    curl http://localhost:2019/config/

    # 更新配置
    curl -X PATCH http://localhost:2019/config/ \\
    -H "Content-Type: application/json" \\
    -d '{"apps":{"http":{"servers":{"srv0":{"listen":[":443"]}}}}}'

    反向代理功能

    Caddy 的反向代理功能非常强大,支持负载均衡、健康检查、服务发现等。

    基本反向代理:

    example.com {
    reverse_proxy localhost:8080
    }

    负载均衡:

    example.com {
    reverse_proxy localhost:8080 localhost:8081 localhost:8082 {
    # 负载均衡策略
    lb_policy least_conn # 最少连接
    # lb_policy round_robin # 轮询(默认)
    # lb_policy ip_hash # IP 哈希
    # lb_policy first # 第一个可用

    # 健康检查
    health_uri /health
    health_interval 10s
    health_timeout 5s

    # 故障转移
    fail_duration 30s
    max_fails 3
    unhealthy_status 500 502 503
    }
    }

    WebSocket 支持:

    example.com {
    reverse_proxy /ws localhost:8080 {
    # WebSocket 升级
    header_up Connection "Upgrade"
    header_up Upgrade "websocket"
    }
    }

    服务发现:

    example.com {
    reverse_proxy consul://service-name
    # 或
    reverse_proxy kubernetes://service-name:8080
    }

    插件系统

    Caddy 的插件系统非常灵活,可以通过模块扩展功能。

    内置模块:

    • http:HTTP 服务器
    • tls:TLS 管理
    • reverse_proxy:反向代理
    • file_server:静态文件服务器
    • encode:压缩
    • log:日志
    • header:HTTP 头部操作

    第三方插件:

    • caddy-dns/cloudflare:Cloudflare DNS 挑战
    • caddy-dns/route53:AWS Route53 DNS 挑战
    • caddy-auth-portal:认证门户
    • caddy-rate-limit:速率限制
    • caddy-cache:HTTP 缓存

    使用插件:

    # 使用 xcaddy 构建带插件的 Caddy
    xcaddy build \\
    –with github.com/caddy-dns/cloudflare \\
    –with github.com/mholt/caddy-ratelimit

    性能优化

    Caddy 的性能优化主要体现在:

  • Go 语言优势:编译型语言,性能接近 C
  • 单二进制:无外部依赖,启动快速
  • 并发模型:Go 的 goroutine 实现高并发
  • 内存管理:Go 的 GC 自动管理内存
  • 零拷贝:减少数据拷贝,提高性能
  • 性能对比(参考数据):

    • 吞吐量:与 Nginx 相当
    • 内存占用:略高于 Nginx,但可接受
    • CPU 使用:与 Nginx 相当
    • 启动时间:比 Nginx 快

    项目地址与资源

    官方资源

    • 🌟 GitHub: github.com/caddyserver/caddy
    • 📚 文档: caddyserver.com/docs
    • 💬 社区论坛: caddy.community
    • 🐛 Issue Tracker: GitHub Issues
    • 📦 下载: GitHub Releases
    • 🌐 官网: caddyserver.com

    相关资源

    • CertMagic:自动证书管理库 – github.com/caddilicious/certmagic
    • xcaddy:Caddy 构建工具 – github.com/caddyserver/xcaddy
    • Caddy 插件列表:caddyserver.com/docs/modules
    • Caddyfile 语法:caddyserver.com/docs/caddyfile
    • JSON API 文档:caddyserver.com/docs/api

    适用人群

    • Web 开发者:需要快速部署 HTTPS 网站
    • 运维工程师:需要简化 Web 服务器配置
    • DevOps 工程师:需要现代化的反向代理和负载均衡
    • 个人开发者:需要零配置 HTTPS 开发环境
    • 企业团队:需要生产级 Web 服务器,支持多站点管理

    欢迎来我中的个人主页找到更多有用的知识和有趣的产品

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 一天一个开源项目(第46篇):Caddy - 自动 HTTPS 的现代化 Web 服务器,支持 HTTP/3
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!