Caddy Web服务器初体验:简洁高效的现代选择
2025年4月2日 19:16
Caddy简介
Caddy是一款使用Go语言编写的开源Web服务器和反向代理服务器,旨在提供易于使用且高效的性能。它支持HTTP/HTTPS协议,并可作为反向代理服务器、负载均衡器和WebSocket支持等。Caddy的灵活性和模块化架构使其适合容器化环境和微服务架构。
Caddy的主要特点
- 默认启用HTTPS:Caddy集成了Let’s Encrypt,可以自动申请、更新和管理SSL证书,无需额外操作。
- 配置简洁:Caddy的配置文件(Caddyfile)简洁易读,降低了新手的学习成本。
- 动态配置管理:通过REST API,可以在运行时更改Caddy的配置,无需重新启动服务器。
- 现代化特性:支持Prometheus metrics,使用结构化的JSON作为访问日志。
Caddy与Nginx的对比
特性 | Caddy | Nginx |
---|---|---|
配置方式 | Caddyfile, JSON, REST API | Nginx配置文件(nginx.conf) |
自动HTTPS支持 | 是,默认启用自动TLS证书管理 | 否,需手动配置SSL证书 |
适用范围 | 7层(应用层),反向代理和Web服务,内置负载均衡 | 支持4层(传输层)和7层(应用层)反向代理、负载均衡等 |
扩展性 | 插件化架构,支持扩展 | 模块化架构,支持静态编译的模块 |
性能 | 较高(适合轻量应用) | 非常高(适合高并发应用) |
配置简洁性 | Caddyfile格式简洁,易于上手 | 配置相对复杂,灵活但不够直观 |
系统资源占用 | 较低 | 较低,适合高并发处理 |
编写语言 | Go语言 | C语言 |
Access日志格式 | 结构化,默认JSON格式,支持自定义 | 非结构化,默认标准日志格式,支持自定义 |
Caddy的基本用法
安装方式
- 二进制安装:下载Caddy的二进制文件并移动到PATH下即可使用。
- Docker Compose安装:使用Docker容器快速部署Caddy。
Docker Compose配置示例:
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
environment:
- ACME_AGREE=true
volumes:
caddy_data:
caddy_config:
配置方式
- Caddyfile配置:简洁易读的配置文件。
- JSON配置:适合高级使用场景和动态配置。
- REST API配置:动态管理和变更配置。
Caddyfile示例:
example.com {
reverse_proxy 127.0.0.1:3000
log {
output file /var/log/caddy/access.log {
mode 644
}
format json
}
}
JSON配置示例:
{
"apps": {
"http": {
"servers": {
"example": {
"listen": [":80"],
"routes": [
{
"match": [
{
"host": ["example.com"]
}
],
"handle": [
{
"handler": "static_response",
"body": "Hello, world!"
}
]
}
]
}
}
}
}
}
常见配置示例
-
直接回复:
localhost:2017 { respond "Hello, world!" }
-
配置静态文件:
localhost:2016 { root * /var/www/mysite file_server { browse hide .git precompressed zstd br gzip } }
-
配置反向代理:
example.com { reverse_proxy localhost:8000 }
-
配置负载均衡:
example.com { reverse_proxy / backend1.example.com backend2.example.com }
Caddy的持久化存储
- 配置文件:自定义配置文件需要放置在合理的位置。
- 数据目录:用于存储TLS证书和其他关键数据。
- 配置目录:保存最后一次有效的配置。
在使用Docker容器时,需要挂载这些目录以确保数据持久化。
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config