Caddy 简介 #

什么是 Caddy? #

Caddy 是一个强大的、企业级的、开源的 Web 服务器,具有自动 HTTPS 功能。它由 Matthew Holt 于 2015 年创建,使用 Go 语言编写,专为现代 Web 而设计。

核心定位 #

text
┌─────────────────────────────────────────────────────────────┐
│                         Caddy                                │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  自动 HTTPS  │  │  反向代理    │  │  静态文件    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  负载均衡    │  │  API 网关    │  │  动态配置    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘

Caddy 的历史 #

发展历程 #

text
2015年 ─── Caddy 项目启动
    │
    │      Matthew Holt 创建
    │      首创自动 HTTPS 功能
    │
2017年 ─── Caddy 1.0
    │
    │      稳定版本发布
    │      社区快速增长
    │
2020年 ─── Caddy 2.0
    │
    │      完全重写架构
    │      更强大的配置系统
    │      原生 JSON 配置支持
    │
2022年 ─── Caddy 2.6
    │
    │      性能大幅提升
    │      更多内置功能
    │
至今   ─── 持续更新
    │
    │      活跃的社区
    │      丰富的插件生态

里程碑版本 #

版本 时间 重要特性
0.5 2015 首个公开版本
0.8 2016 HTTP/2 支持
1.0 2017 稳定版本发布
2.0 2020 完全重写,JSON 配置
2.1 2020 改进的 API
2.4 2021 原生 Cloudflare DNS 支持
2.5 2022 改进的日志系统
2.6 2022 性能优化

为什么选择 Caddy? #

传统 Web 服务器的痛点 #

在没有 Caddy 之前,配置 HTTPS 需要以下步骤:

bash
# 传统方式配置 HTTPS
# 1. 安装 Certbot
sudo apt install certbot

# 2. 获取证书
sudo certbot certonly --standalone -d example.com

# 3. 配置 Nginx
server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # ... 更多 SSL 配置
}

# 4. 设置自动续期
sudo crontab -e
# 添加定时任务
0 0 1 * * certbot renew --quiet

Caddy 的解决方案 #

caddyfile
# Caddyfile - 只需一行!
example.com

# 就这么简单!Caddy 会自动:
# - 获取 Let's Encrypt 证书
# - 配置 HTTPS
# - 设置 HTTP 到 HTTPS 重定向
# - 自动续期

Caddy 的核心特点 #

1. 自动 HTTPS #

Caddy 最显著的特点是自动 HTTPS:

caddyfile
# 自动获取证书
example.com {
    respond "Hello, HTTPS!"
}

# 多域名自动证书
app1.example.com, app2.example.com {
    respond "Multiple domains!"
}

2. 简洁的配置语法 #

Caddyfile 语法直观易懂:

caddyfile
example.com {
    # 静态文件服务
    root * /var/www/html
    file_server
    
    # 反向代理
    reverse_proxy localhost:3000
    
    # 日志
    log {
        output file /var/log/caddy/access.log
    }
}

3. 零停机重载 #

配置更改无需停止服务:

bash
# 平滑重载配置
caddy reload --config Caddyfile

# 服务不会中断
# 新连接使用新配置
# 旧连接继续处理

4. 内置安全最佳实践 #

Caddy 默认启用安全配置:

text
┌─────────────────────────────────────────────────────────────┐
│                    Caddy 默认安全配置                        │
├─────────────────────────────────────────────────────────────┤
│  ✅ TLS 1.2/1.3                                             │
│  ✅ 强加密套件                                               │
│  ✅ HSTS 头                                                 │
│  ✅ OCSP Stapling                                           │
│  ✅ HTTP/2 和 HTTP/3                                        │
│  ✅ 自动证书续期                                             │
└─────────────────────────────────────────────────────────────┘

5. 动态配置 API #

通过 API 实时修改配置:

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

# 动态添加站点
curl -X POST localhost:2019/config/apps/http/servers/srv0/routes \
  -H "Content-Type: application/json" \
  -d '{"match":[{"host":["new.example.com"]}],"handle":[{"handler":"static_response","body":"Hello!"}]}'

6. 高性能 #

使用 Go 语言编写,性能优异:

text
┌─────────────────────────────────────────────────────────────┐
│                    Caddy 性能特点                            │
├─────────────────────────────────────────────────────────────┤
│  🚀 单二进制文件,无依赖                                      │
│  🚀 高效的事件驱动架构                                        │
│  🚀 智能连接池管理                                           │
│  🚀 内存占用低                                               │
│  🚀 并发处理能力强                                           │
└─────────────────────────────────────────────────────────────┘

Caddy 与其他 Web 服务器对比 #

Caddy vs Nginx #

特性 Caddy Nginx
自动 HTTPS ✅ 内置 ❌ 需 Certbot
配置语法 ✅ 简单直观 ⚠️ 较复杂
性能 ✅ 高 ✅ 极高
学习曲线 ✅ 平缓 ⚠️ 较陡
动态配置 ✅ 原生 API ⚠️ 需 OpenResty
社区生态 🔄 发展中 ✅ 成熟

Caddy vs Apache #

特性 Caddy Apache
自动 HTTPS ✅ 内置 ❌ 需手动
配置语法 ✅ 简洁 ⚠️ 复杂
性能 ✅ 高 ⚠️ 中等
内存占用 ✅ 低 ⚠️ 较高
模块化 ✅ 插件 ✅ 模块

Caddy vs Traefik #

特性 Caddy Traefik
自动 HTTPS
配置方式 Caddyfile/JSON Labels/YAML
容器集成 ✅ 良好 ✅ 原生
学习曲线 ✅ 简单 ⚠️ 中等
静态文件 ✅ 内置 ❌ 需配置

Caddy 的应用场景 #

1. 静态网站托管 #

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

2. 反向代理 #

caddyfile
api.example.com {
    reverse_proxy localhost:3000
}

app.example.com {
    reverse_proxy localhost:8080
}

3. 负载均衡 #

caddyfile
app.example.com {
    reverse_proxy {
        to localhost:3000
        to localhost:3001
        to localhost:3002
        lb_policy round_robin
    }
}

4. API 网关 #

caddyfile
api.example.com {
    # 认证
    basicauth {
        user JDJhJDEwJEVCNmdaNEg2Ti5iejRBNWd3U2JtZS9tZy4wbXpXLlF2SjRXTU9wSjZPUW
    }
    
    # 路由
    handle /api/users/* {
        reverse_proxy localhost:3001
    }
    
    handle /api/orders/* {
        reverse_proxy localhost:3002
    }
}

5. 开发环境 #

caddyfile
# 本地开发 HTTPS
localhost {
    reverse_proxy localhost:3000
    tls internal
}

# 开发域名
dev.example.com {
    reverse_proxy localhost:3000
}

Caddy 的核心概念 #

Caddyfile #

Caddyfile 是 Caddy 的配置文件,使用简洁的 DSL 语法:

caddyfile
# 站点地址
example.com {
    # 指令
    root * /var/www/html
    file_server
}

指令(Directives) #

指令是 Caddyfile 的核心组成部分:

caddyfile
example.com {
    # 常用指令
    root * /var/www/html      # 设置根目录
    file_server               # 静态文件服务
    reverse_proxy localhost:3000  # 反向代理
    encode gzip               # 压缩
    log                       # 日志
    basicauth                 # 基础认证
}

匹配器(Matchers) #

匹配器用于精确控制请求匹配:

caddyfile
example.com {
    # 路径匹配
    handle /api/* {
        reverse_proxy localhost:3000
    }
    
    # 文件扩展名匹配
    @static {
        path *.css *.js *.png
    }
    header @static Cache-Control "public, max-age=31536000"
    
    # 方法匹配
    @post {
        method POST
    }
    respond @post "Method not allowed" 405
}

配置适配器 #

Caddy 支持多种配置格式:

格式 适配器 说明
Caddyfile caddyfile 默认格式,简洁易读
JSON json 原生格式,完整功能
YAML yaml 需要 yaml 适配器
TOML toml 需要 toml 适配器

Caddy 的架构 #

整体架构 #

text
┌─────────────────────────────────────────────────────────────┐
│                      Caddy 架构                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    │
│  │  Caddyfile  │    │    JSON     │    │    API      │    │
│  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘    │
│         │                  │                  │            │
│         └──────────────────┼──────────────────┘            │
│                            ▼                               │
│                  ┌─────────────────┐                       │
│                  │  配置适配器      │                       │
│                  └────────┬────────┘                       │
│                           ▼                                │
│                  ┌─────────────────┐                       │
│                  │  核心配置结构    │                       │
│                  └────────┬────────┘                       │
│                           ▼                                │
│  ┌────────────────────────────────────────────────────┐   │
│  │                    应用层                           │   │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐  │   │
│  │  │  HTTP   │ │  TLS    │ │  DNS    │ │ Storage │  │   │
│  │  └─────────┘ └─────────┘ └─────────┘ └─────────┘  │   │
│  └────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

HTTP 处理流程 #

text
请求 → TLS 握手 → 路由匹配 → 处理器链 → 响应
         │            │           │
         ▼            ▼           ▼
    自动证书      匹配器      指令执行

学习路径 #

text
入门阶段
├── 安装与配置
├── 编写第一个 Caddyfile
├── 静态文件服务
└── 反向代理配置

进阶阶段
├── HTTPS 配置
├── 负载均衡
├── 访问控制
└── 日志管理

高级阶段
├── API 动态配置
├── 插件开发
├── 性能优化
└── 故障排查

实战阶段
├── Docker 部署
├── 生产环境配置
├── 多站点管理
└── 最佳实践

下一步 #

现在你已经了解了 Caddy 的基本概念,接下来学习 安装配置 开始实际使用 Caddy!

最后更新:2026-03-28