Caddy 完整教學 2026:75K 星自動 HTTPS 網頁伺服器,從 Caddyfile、反向代理到 Docker 部署一次學會

Caddy 是目前最受歡迎的自動 HTTPS 網頁伺服器,GitHub 75,371 星、Go 語言撰寫、單一執行檔無任何依賴。這篇完整教學教你 5 分鐘部署靜態網站、一行 Caddyfile 設定反向代理(Vaultwarden、FastAPI、n8n 都能用)、自動申請與續期 Let's Encrypt/ZeroSSL 憑證,最後用 Docker Compose 上生產環境。附 Caddy 與 Nginx 詳細比較表與常見陷阱。

  • Dennis
  • 6 分鐘閱讀
Caddy 完整教學 2026:75K 星自動 HTTPS 網頁伺服器,從 Caddyfile、反向代理到 Docker 部署一次學會

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 Stars75,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:該怎麼選?

比較項目CaddyNginx
設定難度低,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 /new301 重導向
@條件 { ... }請求匹配器(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 部署玩熟。等你把第一張憑證「自動」簽發出來的那一刻,你就回不去了。

延伸閱讀

參考來源

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友