文件
一個 專案

反向代理快速入門

本指南將展示如何快速建立一個具備或不具備 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 交握)。