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!"
}
]
}
]
}
}
}
}
}
常見配置示例
1、直接回復:
localhost:2017 {
respond "Hello, world!"
}
2、配置靜態文件:
localhost:2016 {
root * /var/www/mysite
file_server {
browse
hide .git
precompressed zstd br gzip
}
}
3、配置反向代理:
example.com {
reverse_proxy localhost:8000
}
4、配置負載均衡:
example.com {
reverse_proxy / backend1.example.com backend2.example.com
}
Caddy的持久化存儲
- 配置文件:自定義配置文件需要放置在合理的位置。
- 數據目錄:用于存儲TLS證書和其他關鍵數據。
- 配置目錄:保存最后一次有效的配置。
在使用Docker容器時,需要掛載這些目錄以確保數據持久化。
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config