Caddy 从入门到精通 / 01 - 初识 Caddy / Introduction to Caddy
初识 Caddy / Introduction to Caddy
Caddy 是什么? / What is Caddy?
Caddy 是一个用 Go 语言编写的现代 Web 服务器,以 自动 HTTPS、零配置启动 和 人类友好的配置语法 著称。
Caddy is a modern web server written in Go, known for its automatic HTTPS, zero-config startup, and human-friendly configuration syntax.
它同时是:
- Web 服务器 / Web Server
- 反向代理 / Reverse Proxy
- 负载均衡器 / Load Balancer
- API 网关 / API Gateway
与 Nginx、Apache 并列为三大主流 Web 服务器,但设计理念完全不同。
🟢 基础 / Basics — 为什么选 Caddy? / Why Caddy?
1. 自动 HTTPS(开箱即用)
example.com {
respond "Hello, World!"
}
仅仅 3 行配置,Caddy 就会:
- 自动申请 Let’s Encrypt 证书
- 自动配置 TLS
- 自动续期证书
- HTTP 自动跳转 HTTPS
Nginx 要做到同样效果,需要 30+ 行配置 + certbot + cron job。
2. 配置语法极其简洁
Nginx:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/html;
index index.html;
}
Caddy:
example.com {
root * /var/www/html
file_server
}
3. 无需 reload 即可热更新
caddy reload
Caddy 支持 graceful reload,不会断开任何连接。
🟡 进阶 / Intermediate — Caddy 的设计哲学 / Design Philosophy
与 Nginx 的核心差异
| 维度 | Nginx | Caddy |
|---|---|---|
| 配置语言 | 自定义 DSL | Caddyfile / JSON API |
| HTTPS | 手动配置 | 全自动 |
| 模块扩展 | 编译时静态加载 | 运行时动态插件 |
| 配置格式 | nginx.conf | Caddyfile → JSON API |
| 零停机更新 | nginx -s reload | caddy reload |
| 首次发布 | 2004 | 2015 |
Caddy 的两种配置模式
模式一:Caddyfile(推荐新手)
localhost {
respond "Hello"
}
模式二:JSON API(生产推荐)
{
"apps": {
"http": {
"servers": {
"myserver": {
"listen": [":443"],
"routes": [{
"match": [{"host": ["example.com"]}],
"handle": [{"handler": "static_response", "body": "Hello"}]
}]
}
}
}
}
}
两者关系:Caddyfile 最终会被 caddy adapt 转换为 JSON。JSON 是 Caddy 的"原生语言"。
🔴 高级 / Advanced — Caddy 内部架构 / Internal Architecture
请求处理管线(Request Handling Pipeline)
Client Request
│
▼
┌─────────────┐
│ Listener │ ← TLS 终止 / TLS Termination
└─────┬───────┘
▼
┌─────────────┐
│ Router │ ← 路由匹配 / Route Matching
└─────┬───────┘
▼
┌─────────────┐
│ Middleware │ ← 洋葱模型 / Onion Model
│ Chain ↓ │
│ Handler │
│ Chain ↑ │
└─────┬───────┘
▼
┌─────────────┐
│ Response │ ← 返回客户端 / Write Response
└─────────────┘
核心概念:Module 系统
Caddy 的一切功能都是 Module:
// 每个 handler 都是一个 module
type Handler interface {
ServeHTTP(http.ResponseWriter, *http.Request) error
}
file_server→ modulereverse_proxy→ modulebasicauth→ moduleencode→ module
这就是为什么 Caddy 可以通过 xcaddy 编译自定义插件:你只是注册了一个新的 module。
Caddyfile → JSON 的转换过程
Caddyfile
│
▼ caddy adapt
JSON Config
│
▼ caddy run
Runtime
理解这个流程很重要:当你调试配置问题时,caddy adapt --pretty 是你最好的朋友。
小结 / Summary
| 层级 | 你需要知道的 / What You Need to Know |
|---|---|
| 🟢 基础 | Caddy 自动 HTTPS、配置简洁、Go 编写 |
| 🟡 进阶 | Caddyfile vs JSON API、与 Nginx 差异 |
| 🔴 高级 | 请求处理管线、Module 系统、配置转换流程 |