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

引言

"Every site on HTTPS"

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

还在为配置 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 一样)。

项目数据

技术栈

  • 语言: 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 服务器,让开发者能够:

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

使用场景

  1. 静态网站托管

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

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

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

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

    • Docker 容器
    • Kubernetes Ingress
    • 云原生应用

快速开始

安装

bash 复制代码
# 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)

caddyfile 复制代码
# 自动 HTTPS,零配置
localhost

respond "Hello, Caddy!"

运行

bash 复制代码
# 使用 Caddyfile
caddy run

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

# 后台运行
caddy start --config Caddyfile

访问

反向代理示例

caddyfile 复制代码
example.com {
    reverse_proxy localhost:8080
}

静态文件服务

caddyfile 复制代码
example.com {
    root * /var/www/html
    file_server
}

核心特性

  1. 自动 HTTPS

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

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

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

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

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

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

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

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

项目优势

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

为什么选择 Caddy?

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

项目详细剖析

架构设计

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

核心组件

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

设计理念

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

自动 HTTPS 实现

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

工作流程

markdown 复制代码
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 握手验证

配置示例

caddyfile 复制代码
# 自动 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:快速建立连接

自动降级

scss 复制代码
HTTP/3 (QUIC/UDP)
    ↓ (UDP 不可用)
HTTP/2 (TCP)
    ↓ (HTTP/2 不可用)
HTTP/1.1 (TCP)

配置

caddyfile 复制代码
# 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 语法

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 配置

json 复制代码
{
  "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"
              }
            ]
          }
        ]
      }
    }
  }
}

动态配置

bash 复制代码
# 通过 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 的反向代理功能非常强大,支持负载均衡、健康检查、服务发现等。

基本反向代理

caddyfile 复制代码
example.com {
    reverse_proxy localhost:8080
}

负载均衡

caddyfile 复制代码
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 支持

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

服务发现

caddyfile 复制代码
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 缓存

使用插件

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

性能优化

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

  1. Go 语言优势:编译型语言,性能接近 C
  2. 单二进制:无外部依赖,启动快速
  3. 并发模型:Go 的 goroutine 实现高并发
  4. 内存管理:Go 的 GC 自动管理内存
  5. 零拷贝:减少数据拷贝,提高性能

性能对比(参考数据):

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

项目地址与资源

官方资源

相关资源

适用人群

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

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

相关推荐
IvorySQL5 小时前
PostgreSQL 技术日报 (3月10日)|IIoT 性能瓶颈与内核优化新讨论
数据库·postgresql·开源
非优秀程序员6 小时前
OpenClaw 2026 最新功能全解析:Gemini、PDF 原生到安全强化完整拆解
人工智能·开源·产品经理
非优秀程序员7 小时前
OpenClaw 教学:25 个工具 + 53 个技能完整指南
人工智能·开源·全栈
SkyWalking中文站8 小时前
在成熟开源大型项目中实践 Agentic Vibe Coding:软件工程与工程控制论还在延续
开源·vibecoding
碳基沙盒8 小时前
QQ接入openclaw 保姆级教程
开源
答案answer13 小时前
Three.js3D编辑器必备的相机视图插件
开源·github·three.js
冬奇Lab1 天前
OpenClaw 深度解析(八):Skill 系统——让 LLM 按需学习工作流
人工智能·开源·源码阅读
冬奇Lab1 天前
一天一个开源项目(第45篇):OpenAI Agents SDK Python - 轻量级多 Agent 工作流框架,支持 100+ LLM 与实时语音
人工智能·开源·openai
阿里云云原生1 天前
Team 版 OpenClaw:HiClaw 开源,5 分钟完成本地安装
开源