Caddy 是一個用 Go 寫的開源網頁伺服器(GitHub 75K 星),最大賣點是「自動 HTTPS」:只要設定檔寫上網域名稱,它就會自動向 Let’s Encrypt 或 ZeroSSL 申請憑證、自動續期、自動啟用 HTTP/2 與 HTTP/3,5 分鐘就能讓你的服務安全上線。
對自架族來說,這幾乎是「SSH 進 VPS 後最想立刻裝上的東西」。你不需要懂憑證簽發流程、不用寫 certbot renew cron、不用管 443 埠的設定細節——Caddy 把過去 Nginx + Certbot 最繁瑣的部分全部收進一個執行檔裡。這篇教學從安裝、Caddyfile 語法、靜態網站、反向代理,到 Docker 部署與常見陷阱,一次講完。
什麼是 Caddy?
Caddy 由 Matthew Holt 於 2014 年開始開發,是史上第一個預設就自動啟用 HTTPS 的網頁伺服器,至今已服務過數兆次請求、管理數百萬張 TLS 憑證。目前由 ZeroSSL(HID Global 旗下)維護,原始碼採 Apache-2.0 授權。
| 特性 | Caddy |
|---|---|
| GitHub Stars | 75,371 |
| 語言 | Go(記憶體安全、單一靜態執行檔) |
| 授權 | Apache-2.0(可商用) |
| 設定方式 | Caddyfile(簡單)+ JSON(原生)+ API |
| HTTPS | 自動申請、自動續期、自動啟用 HTTP/2/3 |
| 外部依賴 | 無(連 libc 都不需要) |
| HTTP 版本 | HTTP/1.1、HTTP/2、HTTP/3 全支援 |
| 設定熱更新 | 內建 API,免重啟 |
核心設計哲學:「Every site on HTTPS」。Caddy 的 TLS 能力由底層的 CertMagic 函式庫驅動,支援 ZeroSSL 與 Let’s Encrypt 雙簽發者、多簽發者備援(multi-issuer fallback)、內部名稱與 IP 的自管憑證,甚至支援 ECH(Encrypted ClientHello)。
Caddy vs Nginx:該怎麼選?
| 比較項目 | Caddy | Nginx |
|---|---|---|
| 設定難度 | 低,Caddyfile 幾行搞定 | 中高,語法細碎 |
| 自動 HTTPS | ✅ 內建,零設定 | ❌ 需自行搭配 Certbot |
| 憑證續期 | 自動 | 需 cron 排程 |
| 靜態執行檔 | ✅ 單一 binary,無依賴 | 需安裝相依套件 |
| HTTP/3 | ✅ 預設支援 | 需另行編譯設定 |
| 設定熱載入 | ✅ API 即時更新 | 需 reload |
| 生態系/模組 | 外掛需 xcaddy 重新編譯 | 模組豐富、範例多 |
| 企業普及度 | 持續成長中 | 極高,文件與人力好找 |
| 學習資源(中文) | 較少 | 極多 |
結論:如果目標是「自架服務快速上 HTTPS」或「不想再被憑證續期搞到半夜」,Caddy 是碾壓級的選擇;如果團隊已有深厚的 Nginx 經驗與既有設定庫,或需要極度細緻的流量控制(複雜 rewrite、限流、多層 cache),Nginx 仍有其位置。Caddy 甚至內建 config adapter 可以把 Nginx 設定轉成 Caddy 格式,遷移成本比想像中低。
安裝 Caddy
Linux(Debian/Ubuntu 官方 apt 源)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
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
Docker(最快)
docker run -p 80:80 -p 443:443 \
-v caddy_data:/data -v caddy_config:/config \
caddy:latest
驗證安裝
caddy version
# v2.x.x ...
caddy list-modules | head # 列出內建模組
Caddyfile 基礎:3 個必學範例
Caddyfile 是 Caddy 的人類友善設定格式。第一行是網站位址,大括號內是指令。
範例 1:靜態網站(5 行搞定)
example.com {
root * /var/www/example
file_server
}
就這些。example.com 對外服務 /var/www/example 目錄,Caddy 自動申請憑證、自動啟用 HTTPS,連 http:// 都會自動 301 跳到 https://。
範例 2:反向代理(一行核心指令)
api.example.com {
reverse_proxy localhost:8000
}
把 api.example.com 的流量轉給本機 8000 埠(例如 FastAPI、Node.js、Go 服務),TLS 全部交給 Caddy。
範例 3:多站點共存
example.com {
root * /var/www/example
file_server
}
blog.example.com {
reverse_proxy localhost:8080
}
vault.example.com {
reverse_proxy localhost:8081
}
一個 Caddyfile 管理多個站點,各自獨立設定,互不干擾。
實戰 1:Vaultwarden 自架密碼管理器 + 自動 HTTPS
如果你照著我們的 Vaultwarden 教學自架過 Bitwarden 相容密碼管理器,一定記得設定 HTTPS 那段有多麻煩——用 Caddy 只需要一個檔案:
vault.yourdomain.com {
reverse_proxy localhost:8080
}
把 vault.yourdomain.com 換成你的網域,DNS 指到伺服器 IP,重啟 Caddy:
sudo systemctl restart caddy
30 秒內憑證自動簽發完成,瀏覽器鎖頭直接變綠。沒有 certbot、沒有 nginx.conf 修改、沒有手動續期。
實戰 2:FastAPI 服務上線(搭配 Docker Compose)
假設你有一個 FastAPI 應用(FastAPI 完整教學),用 Docker Compose 把 API 與 Caddy 一起跑:
services:
api:
build: .
expose:
- "8000" # 只對內網暴露
caddy:
image: caddy:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- api
volumes:
caddy_data:
caddy_config:
Caddyfile:
api.yourdomain.com {
reverse_proxy api:8000
}
注意這裡用 api:8000 而不是 localhost:8000——因為在 Compose 網路裡,服務名稱就是主機名稱。caddy_data 這個 volume 是憑證儲存庫,一定要用具名 volume 或掛載實體目錄,否則每次重建容器都要重新簽發憑證(會被簽發速率限制卡到)。
graph LR
U[使用者瀏覽器] -->|HTTPS 443| C[Caddy 容器]
C -->|HTTP 80 內部| A[FastAPI 容器 :8000]
C -->|自動簽發/續期| L[(Let's Encrypt / ZeroSSL)]
C -->|憑證儲存| D[(caddy_data volume)]進階技巧
1. 全域設定(憑證信箱、管理介面)
{
email admin@yourdomain.com # 憑證簽發通知信箱
admin off # 關閉管理 API(生產環境建議)
acme_ca https://acme-v02.api.letsencrypt.org/directory
}
api.yourdomain.com {
reverse_proxy localhost:8000
}
2. 設定熱更新(免重啟)
Caddy 內建 REST API,改完設定直接推送:
curl localhost:2019/load \
--data-binary @Caddyfile
部署工具(如 Ansible)可以靠這個做到零停機更新。
3. 常見指令速查
| 指令 | 用途 |
|---|---|
file_server | 靜態檔案服務 |
reverse_proxy <位址> | 反向代理 |
try_files | 找不到檔案時的 fallback(SPA 必用) |
encode gzip zstd | 啟用壓縮 |
import 檔案 | 匯入其他設定片段 |
redir /old /new | 301 重導向 |
@條件 { ... } | 請求匹配器(matcher) |
4. 外掛:用 xcaddy 自訂編譯
需要額外模組(如 Cloudflare DNS 驗證)時,用 xcaddy 重新編譯:
xcaddy build --with github.com/caddy-dns/cloudflare
編譯出來的 binary 直接替換即可。
常見陷阱
| 陷阱 | 解法 |
|---|---|
| 憑證簽發失敗 400/429 | 網域 DNS 沒指向伺服器,或短時間簽發太多次。先 dig 確認 DNS,再等速率限制恢復 |
| Docker 重建後憑證消失 | caddy_data 必須用具名 volume 或綁定實體路徑 |
| reverse_proxy 連不到容器 | Compose 內要用服務名稱(api:8000)而不是 localhost |
| 80 埠被佔用 | 檢查其他 web server,Caddy 必須同時能開 80 與 443(ACME 驗證要用 80) |
| 公司內網/測試環境 | 沒有公網網域時,Caddy 會用本地 CA 自動簽發內部憑證,加上 tls internal 指令即可 |
| 想要 Nginx 設定直接搬 | 用 Caddy 的 nginx config adapter,或手動對照翻譯 |
總結
Caddy 適合誰?
- 自架族:Vaultwarden、n8n、Nextcloud、各種 Docker 服務——Caddy 一個入口全包
- 獨立開發者:不想維護 Nginx + Certbot 兩套工具,想 5 分鐘讓產品上線
- 被憑證續期折磨過的人:自動化到讓你再也不記得「到期日」這三個字
先從一個靜態網站開始,再慢慢把反向代理、多站點、Docker 部署玩熟。等你把第一張憑證「自動」簽發出來的那一刻,你就回不去了。
延伸閱讀
- Vaultwarden 完整教學 2026:自架 Bitwarden 相容密碼管理器,Rust 實作、66K 星開源、記憶體只要 10MB(Docker 安裝+HTTPS 設定)
- FastAPI 完整教學 2026:從安裝、路由、Pydantic v2 到依賴注入與部署,Python 最強 API 框架實戰指南
- n8n 完整教學 2026:20 萬星開源 AI 自動化平台,Docker 安裝、工作流實戰與 AI Agent 串接一次學會
