反向代理快速入門
本指南將展示如何快速建立一個具備或不具備 HTTPS 的生產就緒反向代理。
先備條件
- 基本的終端機 / 命令列技能
- PATH 中的
caddy
- 一個正在執行的後端程序可以代理
本教學假設您有一個後端 HTTP 服務在 127.0.0.1:9000
上執行。這些命令適用於 Linux,但相同的原則也適用於其他作業系統。
您可以執行一個沒有設定檔的簡單反向代理,或者您可以使用設定檔來獲得更大的彈性和控制權。
命令列
要在您的機器上從埠 2080 到埠 9000 啟動一個純文字 HTTP 代理
caddy reverse-proxy --from :2080 --to :9000
然後嘗試
curl -v 127.0.0.1:2080
reverse-proxy
命令 用於快速和簡易的反向代理。(如果您的需求很簡單,您可以在生產環境中使用它。)
Caddyfile
在目前的工作目錄中,建立一個名為 Caddyfile
的檔案,內容如下
:2080
reverse_proxy :9000
該設定檔大致等於上述的 caddy reverse-proxy
命令。
然後,從同一個目錄執行
caddy run
然後嘗試你的代理伺服器
curl -v 127.0.0.1:2080
如果你變更 Caddyfile,請務必重新載入 Caddy。
這是一個簡單的範例。你可以使用reverse_proxy
指令執行更多操作。
從用戶端到代理伺服器的 HTTPS
如果 Caddy 知道主機名稱(網域名稱),它會自動且預設以HTTPS 提供你的代理伺服器。如果你省略 --from
旗標,caddy reverse-proxy
指令會預設為 localhost
,或者你可以用代理伺服器的網域名稱取代 Caddyfile 的第一行。
- 如果你使用
localhost
或任何以.localhost
結尾的網域,Caddy 會使用自動更新的自簽憑證。你第一次執行此操作時,可能需要輸入密碼,因為 Caddy 會嘗試將其 CA 的根憑證安裝到你的信任儲存區。 - 如果你使用任何其他網域名稱,Caddy 會嘗試取得公眾信任的憑證;請確保你的 DNS 記錄指向你的電腦,且埠 80 和 443 對公眾開放並導向 Caddy。
如果你未指定埠,Caddy 會預設使用 443 作為 HTTPS。在這種情況下,你還需要有權限繫結到低埠。在 Linux 上執行此操作的方法有幾種
- 以 root 身分執行(例如
sudo -E
)。 - 或執行
sudo setcap cap_net_bind_service=+ep $(which caddy)
以授予 Caddy 此特定功能。
以下是提供 HTTPS 的最基本的 caddy reverse-proxy
指令
caddy reverse-proxy --to :9000
然後嘗試
curl -v https://127.0.0.1
你可以使用 --from
旗標自訂主機名稱
caddy reverse-proxy --from example.com --to :9000
如果你沒有權限繫結到低埠,你可以從較高埠進行代理
caddy reverse-proxy --from example.com:8443 --to :9000
如果你使用 Caddyfile,只需將第一行變更為你的網域名稱,例如
example.com
reverse_proxy :9000
從代理伺服器到後端的 HTTPS
如果後端支援 TLS,Caddy 也可以在自身和後端之間使用 HTTPS 進行代理。只要在你的後端位址中使用 https://
即可
caddy reverse-proxy --from :2080 --to https://127.0.0.1:9000
這需要後端的憑證受到 Caddy 執行的系統信任。(除非明確設定為執行此操作,否則 Caddy 不會信任自簽憑證。)
當然,你也可以在兩端執行 HTTPS
caddy reverse-proxy --from example.com --to https://example.com:9000
這會提供從用戶端到代理伺服器,以及從代理伺服器到後端的 HTTPS。
如果你要代理到的主機名稱與你代理自的主機名稱不同,則需要使用 --change-host-header
旗標
caddy reverse-proxy \
--from example.com \
--to https://127.0.0.1:9000 \
--change-host-header
預設情況下,Caddy 會傳遞所有未變更的 HTTP 標頭,包括 Host
,而 Caddy 會從 Host 標頭中衍生 TLS ServerName。--change-host-header
會將 Host 標頭重設為後端的標頭,以便 TLS 交握可以順利完成。在上面的範例中,它會從 example.com
變更為 localhost:9000
(而 localhost
會用於 TLS 交握)。