Skip to content

建立 2026-09-15 更新 2026-09-15

反向代理

反向代理(reverse proxy)讓瀏覽器只連 Caddy 的 80/443,再由 Caddy 轉到後面真正的應用程式。後端可以關在防火牆內、用明文 HTTP,對外仍是 HTTPS。這是 homelab 與小型生產環境最常見的用法。

官方:Reverse proxy 快速入門reverse_proxy 指令

最小設定

example.com {
    reverse_proxy 127.0.0.1:3000
}

瀏覽器連 https://example.com,Caddy 終止 TLS,再把請求轉到本機 3000 埠。Host 等標頭預設原樣轉送。

多個子網域就寫多個區塊:

app.example.com {
    reverse_proxy 127.0.0.1:3000
}

api.example.com {
    reverse_proxy 127.0.0.1:8080
}

Docker 裡不要寫 localhost

在容器裡,localhost 是「這個容器自己」,不是主機、也不是隔壁容器。後端要用服務名稱,而且 Caddy 與後端必須在同一 Docker 網路:

app.example.com {
    reverse_proxy app:3000
}

Compose 範例見 Docker 部署

路徑分流

同一個網域依路徑轉到不同後端時,用 handle 互斥,避免兩條規則都匹配:

example.com {
    handle /api/* {
        reverse_proxy 127.0.0.1:8080
    }

    handle {
        reverse_proxy 127.0.0.1:3000
    }
}

handle_path /api/* 會在轉發前把 /api 前綴切掉。後端若自己也預期 /api,用 handle 即可。

負載平衡與健康檢查

多個上游時,Caddy 會做負載平衡。可加策略與主動健康檢查:

example.com {
    reverse_proxy 10.0.1.1:80 10.0.1.2:80 {
        lb_policy least_conn
        health_uri /health
        fail_duration 5s
    }
}

被動失敗(連不上、5xx)會讓該上游暫時退出輪詢。動態後端(SRV、K8s)見官方 dynamic 模組說明。

HTTPS 後端

後端自己也是 HTTPS(例如 Portainer 的 9443 自簽憑證)時:

portainer.example.com {
    reverse_proxy https://portainer:9443 {
        transport http {
            tls_insecure_skip_verify
        }
    }
}

tls_insecure_skip_verify 只表示 Caddy 到後端 不驗證憑證,瀏覽器到 Caddy 這段仍是你的公開憑證。內網自簽很常見,但正式環境更好的做法是讓後端使用 Caddy 信任的憑證。

指令列

沒有 Caddyfile 時:

caddy reverse-proxy --from example.com --to localhost:9000

適合臨時開一個 TLS 終端。長期運行仍應寫進設定檔並用服務管理器守護行程。

逐步畫面示範見 YouTube 優質教學,尤其 Jim's Garage、Christian Lempa 與 Syntax 的 Self Host 101。