所有功能
您可能需要坐下來仔細閱讀。

此顏色 標示的功能由選用外掛程式提供。

概觀

Caddy 本質上是一個組態管理系統,可以執行各種應用程式,例如 HTTP 伺服器、TLS 憑證管理器、PKI 設施等等。它可以使用稱為組態模組的外掛程式進行擴充。

Caddy 具有彈性且強大的 HTTP 反向代理、線上組態 API,以及穩健、可供生產環境使用的靜態檔案伺服器,並且預設透過 HTTPS 以及自動 TLS 憑證為所有網站提供服務。

整體程式技術規格

語言

語言選擇對於網頁伺服器至關重要。語言會影響開發速度和容易度、效能、測試、部署複雜性、生態系統可靠性、依賴性、工具、錯誤處理和可靠性等等。Go 在所有這些領域都具有強大的優勢,可以實現快速開發、穩健的生產效能和高擴展性。
Go

記憶體安全保證

大多數伺服器(NGINX、Apache、HAProxy 等)及其依賴項都是用 C 語言編寫的,這使得它們容易受到災難性的記憶體安全漏洞(例如緩衝區溢位)的攻擊,例如 Heartbleed。像 Caddy 這樣的 Go 程式不受一整類安全漏洞的影響。
強大

建置產物

Caddy 直接編譯為原生 CPU 指令。不需要直譯器;並且許多指令都經過架構最佳化。靜態二進位檔案也因為沒有動態連結,所以更安全
平台原生靜態二進位檔案

執行階段依賴項

Caddy 是靜態編譯的。動態連結的應用程式在生產環境中很容易崩潰,並且由於共用可執行資源是從系統各處載入的,因此可能安全性較低。一般來說,Caddy 二進位檔案不一定需要外部函式庫 — 甚至不需要 libc。

編譯時間

在消費級硬體上,標準 Caddy 建置只需幾秒鐘即可編譯完成。這對於快速迭代、外掛程式開發和低成本部署至關重要。其他用 C/C++ 編寫的伺服器可能需要幾分鐘。
約 30 秒冷啟動編譯,
約 2 秒熱啟動

部署環境

Caddy 幾乎可以部署在任何地方,並且可以透過多種方式部署。一般來說,升級就像替換二進位檔案一樣簡單。
  • 命令列介面
  • 系統服務
  • 容器
  • Kubernetes
  • 嵌入式

供應鏈和發布

Go 模組驗證了我們依賴項的完整性,並且我們以加密方式簽署了我們的發布產物,因此您可以知道您可以信任什麼。
經過加密驗證

作業系統

Caddy 可以在 Go 編譯的所有主要平台上執行。
  • Linux
  • Windows
  • macOS
  • FreeBSD
  • OpenBSD
  • NetBSD
  • Android

微架構

在眾多 CPU 平台上以原生碼執行 Caddy。
  • x86 (i386, i686)
  • x86-64 (AMD64)
  • ARM
  • ARM 64 (AArch64)
  • MIPS
  • MIPS64[LE]
  • PPC64[LE]
  • RISCV64
  • S390X
  • Apple Silicon (Apple ARM;M1、M2 等)

正則表達式引擎

Caddy 的正則表達式語言基於 Thompson NFA,並且相較於其他網頁伺服器使用的 PCRE,具有許多效能改進。它保證執行階段成本呈線性而不是指數級增長。這在評估不受信任的輸入時非常理想。

RE2 語法

RE2

並發模型

Go 的執行階段以比作業系統更聰明的方式最佳化排程的 CPU 時間,使用稱為 goroutine 的輕量級使用者空間執行緒。Caddy 利用所有 CPU 核心,並且可以輕鬆處理每秒數十萬個請求。
Goroutine (epoll + kqueue)

外掛程式模型

Caddy 可以透過編譯時外掛程式進行擴充,這些外掛程式以原生碼編譯,在部署期間或系統升級時不會損壞。由於沒有 IPC 或 RPC 呼叫,Caddy 擴充功能與原生碼的效能相同。
編譯時靜態

高階功能

組態變更

透過零停機時間的優雅重新載入,Caddy 的組態可以在執行時變更。它可以編程/腳本化,以實現強大的自動化。
  • RESTful HTTP API
  • 組態檔案
  • 安全遠端存取

應用程式模組

頂層組態結構稱為應用程式模組或 Caddy 應用程式。它們提供了 Caddy 的大部分功能。任何人都可以編寫應用程式模組,而 Caddy 內建了幾個標準應用程式。
  • HTTP
  • TLS
  • PKI
  • 事件
  • 原始 TCP 和 UDP
  • SSH
  • PHP
  • 動態 DNS
  • 安全性
  • 程序監管
  • 效能分析

日誌

所有 Caddy 模組都使用 Caddy 的集中式日誌記錄設施。Caddy 的日誌記錄可以組態格式、詳細程度、輸出等等。
  • 分級
  • 結構化
  • 高效能、零分配
  • 可擴充
  • 刪除、篩選、編輯和審查欄位
  • IP 遮罩
  • 雜湊值
  • Regex 替換

儲存

資產和狀態,包括憑證和 OCSP Stapling,都儲存在可組態的儲存後端中。實際上,組態為相同儲存的多個 Caddy 實例被視為叢集的一部分,並且可以自動協調。
  • 檔案系統
  • 嵌入式(記憶體內)
  • Postgres
  • Redis
  • Vault
  • Consul

命令列介面

Caddy 的 CLI 不僅實用,而且非常有用。雖然大多數伺服器 CLI 僅僅執行程序並重新載入組態,但 Caddy 的 CLI 更進一步,幫助您輕鬆管理現代網頁伺服器。

外掛程式可以註冊自己的子命令來擴充 Caddy 的 CLI。

命令說明

如果您拼錯命令或標誌、遺漏參數,或不知道子命令,則會自動列印說明文字。您也可以使用 caddy help-h 存取整體命令說明或子命令說明。
內建、自動(也可以產生 man 頁面)

管理 API 包裝器

幾個子命令使用管理 API 端點以與 CLI 搭配使用,以幫助您執行常見任務,例如從檔案載入組態或停止伺服器。
  • 將組態調整為 JSON
  • 啟動伺服器,可選擇使用組態
  • 優雅地重新載入組態
  • 停止伺服器

二進位公用程式

由於 Caddy 的自訂建置非常常見,因此存在幾個命令來幫助您管理和取得有關建置的詳細資訊。
  • 詳細的建置元數據
  • 列出已安裝的組態模組
  • 列出依賴項
  • 新增和移除外掛程式套件
  • 列印版本
  • 升級 Caddy 二進位檔案

組態公用程式

如果您選擇使用組態檔案,Caddy 的 CLI 可以幫助您管理它們。
  • 格式化 Caddyfile
  • 驗證組態
  • 列出依賴項
  • 新增和移除外掛程式套件
  • 列印版本

模組公用程式

模組可以註冊自己的子命令,以提供無需組態文件即可使用的常用功能。
  • 靜態檔案伺服器
  • HTTP 反向代理
  • 靜態 HTTP 回應(可模板化)
  • 儲存匯入/匯出(備份/還原)
  • 雜湊密碼以用於 HTTP 基本身份驗證
  • 匯出檔案瀏覽模板

整合公用程式

幾個子命令可以幫助您將 Caddy 整合到您的 shell 環境中。
  • 產生 shell 完成腳本
  • 列印環境
  • 產生 man 頁面
  • 將 Caddy 管理的根 CA 安裝到信任儲存區中
  • 從信任儲存區中移除 Caddy 管理的根 CA

系統訊號

Caddy 支援常見的作業系統訊號/中斷,但每個訊號的行為略有不同。

訊號文件

  • INT(優雅停止)
  • QUIT
  • TERM

退出代碼

無論 Caddy 成功退出還是發生錯誤退出,退出代碼都可以為您的程序監管器或腳本提供如何處理的提示。

組態

我們設計 Caddy 時,使其組態不僅提供對功能的存取,而且它本身就是一項功能

不再需要爭論哪種組態檔案格式最好:使用您想要的任何格式!Caddy 的組態適配器允許您使用您喜歡的任何組態格式。

原生組態格式

Caddy 的原生組態格式無處不在:它在幾乎每個作業系統、平台、程式語言和 API 生態系統中都有工具。幾乎所有其他格式都可以轉換為 JSON,JSON 在人類可讀性和可編程性之間取得了平衡。您會發現它是您網頁伺服器的強大盟友。
JSON

組態適配器

您始終可以使用其他格式編寫組態,透過組態適配器,Caddy 會隱式地將其轉換為 JSON,以便您可以使用您喜歡的格式。
  • Caddyfile
  • JSON 5
  • JSON-C
  • NGINX Conf
  • YAML
  • CUE
  • TOML
  • HCL
  • Dhall
  • MySQL

人性化的組態

Caddyfile 是大多數使用者手動編寫網頁伺服器組態的首選方式,因為它的語法寬鬆,同時也設計了易於讀寫的結構。它會自動轉換為 JSON。
Caddyfile

匯出

Caddy 的管理 API 允許您透過簡單的 GET 請求,在執行階段存取 JSON 格式的目前組態。

組態 API

Caddy 透過 API 端點接收其組態,該端點可以接受 JSON 或任何其他具有組態適配器的格式。

組態檔案

如果您喜歡使用普通的 shell 命令來管理組態,Caddy 的 CLI 會為您包裝 API 端點。

自動 HTTPS

我們的旗艦功能,由 CertMagic 提供支援。Caddy 是第一個也是唯一一個預設啟用 HTTPS 的主要伺服器,並且會自動獲取和續訂您所有網站的憑證。

完全原生、整合的自動 HTTPS 遠優於任何需要外部工具或 cron 作業的解決方案。Caddy 的憑證維護是業界最佳的,因為它比任何其他解決方案都更穩健、可靠且可擴展。Caddy 簡化了您的基礎架構,而不是使其複雜化。

當然,您可以嘗試使用 Certbot 和 cron 作業部署 100,000 個網站 — 但如果這本身沒有崩潰,網頁伺服器也會崩潰。只有 Caddy 被設計為可以水平和垂直大規模擴展 TLS 憑證。

永遠不必再次手動產生 CSR。永遠不必點擊電子郵件中的連結來下載憑證。永遠不必(錯誤地)組態您的網頁伺服器來使用它們。永遠不必錯過續訂憑證的提醒,每個憑證每隔幾個月在到期前逐一續訂。您甚至不必考慮憑證或 TLS。

這真的是自動魔法。

合規性

Caddy 的 TLS 預設值是安全的,無需任何額外組態,並且通過了各個行業的合規性測試。
  • 符合 PCI DSS 標準
  • 符合 NIST 標準
  • 符合 HIPAA 標準
  • 業界最佳實務

隨需應變 TLS

為不屬於您的網域提供服務?或有很多網域?沒問題!只需幾行組態,隨需應變 TLS 即可在 TLS 握手期間動態取得憑證,將您的部署擴展到數萬個憑證。此功能是 Caddy 獨有的。

憑證簽發者

以與任何簽發機構相容的方式從任何簽發機構取得憑證。憑證簽發者會取得 CSR 並傳回憑證資源。大多數網站只需使用 ACME 即可取得憑證。但是 Caddy 也可以簽發自己的自我簽署憑證,以供內部使用、測試或開發。Caddy 的簽發者來源是可外掛的,因此 Caddy 可以自動化來自任何簽發者模組的憑證。
  • ACME
  • 內部(自我簽署)
  • Microsoft Active Directory 憑證服務

憑證管理器

與簽發者不同,簽發者取得 CSR 並傳回 Caddy 必須管理的憑證,憑證管理器是模組,可以按需傳回始終有效的憑證;也就是說,它們正在為我們管理憑證。Caddy 可以與 HTTP 端點或 Tailscale 介面,以這種方式取得憑證,並且可以透過外掛程式獲得其他方式。
  • HTTP
  • Tailscale

叢集協調

在所有組態為相同儲存的 Caddy 實例中,Caddy 會自動協調並在叢集中共用資源。這包括憑證操作和憑證本身、OCSP Stapling 和會話票證金鑰。這可以減少客戶端的延遲並提高可擴展性。
  • 取得和續訂憑證
  • 載入現有憑證
  • OCSP Stapling
  • 會話票證金鑰 (STEK)

將 HTTP 重新導向到 HTTPS

預設情況下,HTTP 請求將重新導向到 HTTPS。
自動重新導向

OCSP

OCSP 指示憑證何時被撤銷。伺服器應將 OCSP 回應 Stapling 到憑證,以為客戶端提供更好的安全性和隱私。Caddy 是第一個也是唯一一個預設自動執行此操作的伺服器。它還會快取回應以應對 OCSP 回應器中斷,並在整個叢集中共用這些回應。如果需要,可以停用所有這些功能。
自動 OCSP Stapling 和快取

Must-Staple

如果 CA 支援,Caddy 可以取得強制執行 OCSP Stapling 的憑證。在撤銷的情況下,這可能會提供更高程度的安全性。

撤銷處理

撤銷的憑證會自動被替換。由於 Caddy Stapling 並刷新 OCSP 回應,它可以偵測到您的憑證是否已被撤銷,如果已撤銷,它將用新的憑證替換它。

會話票證強化

如果攻擊者竊取了加密會話票證的金鑰,則 TLS 連線就毫無意義了。Caddy 已被學術引用為唯一定期輪換這些金鑰以限制攻擊窗口的伺服器。
自動 STEK 輪換

金鑰類型

您可以自訂用於憑證的金鑰類型。
  • Ed25519
  • ECDSA P256
  • ECDSA P384
  • RSA 2048
  • RSA 4096

憑證生命週期

大多數 ACME 客戶端都假定憑證為 90 天,或者不期望憑證短於 7 天。Caddy 可以成功管理生命週期為數小時和數分鐘的憑證。

Caddy 沒有硬式編碼在特定期限前續訂,而是計算相對於每個憑證生命週期的期限,稱為續訂窗口比率。預設情況下,Caddy 會在憑證可用生命週期的 2/3 後續訂憑證。此比率適用於大多數有效期,但可以調整。

任何生命週期

智慧型錯誤處理

如果 Caddy 無法取得憑證,則會記錄錯誤,並且 Caddy 將以指數退避並根據需要重試,直到成功為止(通常最多 30 天,但可能會更長)。Caddy 會盡一切合理的努力來保持您的憑證續訂。
指數退避

內建節流

Caddy 符合最佳實務,不會向 CA 發送大量憑證請求;相反,每個訂單都經過仔細計時,以避免 CA 伺服器不堪重負。

ACME

Caddy 的 ACME 客戶端是同類產品中最好的,具有比目前任何其他整合 ACME 客戶端更高的可靠性和更多的生產經驗。自 Let's Encrypt 公開發布之前,Caddy 就一直在使用 ACME,並且 Caddy 可以與任何相容 ACME 的 CA 搭配使用。

相容性

某些 ACME 客戶端僅使用 Let's Encrypt 進行測試。Caddy 保證與所有支援 ACME 的 CA 相容。
所有符合 RFC 8555 標準的憑證授權單位,例如
  • Let's Encrypt
  • ZeroSSL
  • Google Trust Services
  • BuyPass
  • DigiCert
  • GlobalSign
  • SSL.com
  • Smallstep

測試端點

預設情況下,在嘗試取得憑證失敗後,Caddy 將回退到 CA 的測試或暫存端點(如果有的話),以避免達到 CA 強制的生產速率限制。這也可能是您專門為驗證 DNS 組態而設定的 ACME 伺服器。
Let's Encrypt(其他可組態)

外部帳戶綁定

您可以選擇組態外部帳戶綁定 (EAB),以使 Caddy 能夠與需要您擁有獨立帳戶的 CA 搭配使用。

質詢類型

Caddy 支援 Web PKI 的所有主要 ACME 質詢類型,並且可以擴充以支援其他類型。
  • HTTP-01
  • TLS-ALPN-01
  • DNS-01

替代質詢埠

雖然某些 ACME 質詢必須使用標準化埠 80 和 443,但如果您透過路由器轉發這些埠,Caddy 支援在替代埠上監聽它們。
  • HTTP(預設 80)
  • TLS-ALPN(預設 443)

智慧型質詢選擇

Caddy 會學習哪些質詢類型最有可能成功,並首先嘗試這些類型。例如,如果埠 80 被封鎖,它將學習優先選擇不使用埠 80 的 TLS-ALPN 質詢。

DNS 質詢整合

DNS 質詢是唯一不需要 CA 能夠存取您的伺服器的質詢。透過 libdns 整合數十個 DNS 提供商來解決 DNS 質詢。此列表不完整; 請參閱 DNS 提供商的完整列表
  • ACME-DNS
  • AliDNS
  • Cloudflare
  • DigitalOcean
  • DNSPod
  • DuckDNS
  • DynDNS
  • EasyDNS
  • Gandi
  • GoDaddy
  • Google Cloud DNS
  • Hetzner
  • Linode
  • Name.com
  • Namecheap
  • Namesilo
  • Netlify
  • OVH
  • Porkbun
  • PowerDNS
  • RFC 2136
  • Route 53
  • Scaleway
  • Vercel
  • Vultr
  • 查看全部...

受信任的 CA 憑證

您可以選擇組態您在與您選擇的 CA 互動時信任的根憑證;這對於在沒有公用 CA 的情況下建立信任的內部 PKI 非常有用。

偏好的鏈

當 CA 提供多個憑證鏈時,Caddy 允許您自訂要下載和使用的鏈。
  • 最小
  • 根的 CommonName
  • 任何的 CommonName

續訂排程

Caddy 選擇保守的時間範圍來續訂憑證,並且如果 ACME CA 提供 ACME 續訂資訊 (ARI),也會從中獲取指導。
  • 內部
  • ARI

HTTP 伺服器

Caddy 的 HTTP 伺服器是獨一無二的:強大、可擴充、高效且現代化。

HTTP 版本

Caddy 的 HTTP 伺服器支援所有主要 HTTP 版本,並預設啟用它們(不包括不安全的 H2C,但可用)。您可以自訂您想要提供的確切版本。
  • HTTP/1.1
  • HTTP/2
  • 透過明文的 HTTP/2 (H2C)
  • HTTP/3

HTTPS

Caddy 的旗艦功能是預設自動啟用 HTTPS。您可以控制其運作方式或停用某些方面:HTTP 重新導向、憑證管理、特定主機名稱等。
自動

監聽介面

每個 HTTP 伺服器都可以繫結到一個或多個套接字和網路介面。對於埠,您可以指定特定的主機介面或僅使用埠的所有介面。也支援各種 Unix 套接字。
  • TCP
  • UDP
  • Unix 套接字

監聽器包裝器

監聽器可以由在連線接受層級運作的模組包裝。
  • 在 HTTPS 埠上重新導向 HTTP
  • PROXY 協定
  • Tailscale

逾時

設定逾時是生產環境中重要的防禦措施,但必須仔細調整以適應具有大型下載或上傳的合法慢速客戶端。
  • 讀取逾時
  • 讀取 HTTP 標頭逾時
  • 寫入逾時
  • 閒置逾時
  • TCP Keep-Alive 間隔

全雙工通訊

並發讀寫 HTTP/1 並非所有客戶端都支援,但可以為需要它的某些客戶端和應用程式啟用。
  • 可為 HTTP/1 組態
  • HTTP/2 的預設值

錯誤處理

Caddy 讓您可以完全控制錯誤處理,以為您的客戶端提供最佳/期望的體驗。
自訂錯誤路由

TLS 終止

使用合理的預設值終止 TLS(以前稱為「SSL」),您可以自訂這些預設值,以讓您精細控制 TLS 握手。您可以根據各種因素(例如 ServerName (SNI) 或遠端 IP)為客戶端分配策略。
  • TLS 1.2
  • TLS 1.3
  • 客戶端身份驗證(TLS 相互身份驗證;mTLS)
  • 客戶端身份驗證模式:請求、要求、如果給定則驗證、要求並驗證
  • 密碼套件
  • 曲線
  • ALPN
  • 限制協定版本
  • 預設 SNI
  • 後備 SNI

跨站安全性

Caddy 通常在同一個套接字上為多個網站提供服務,因此如果它們中的任何一個啟用了 TLS 客戶端身份驗證,Caddy 會自動啟用保護措施以確保您的網站安全。
驗證 TLS ServerName 和 HTTP Host 標頭是否匹配

存取日誌

啟用零分配、結構化的存取日誌,以充分了解客戶端請求和回應。使用 Caddy 的內建日誌記錄組態或使用第三方模組進行自訂。
  • 比通用日誌格式 (CLF) 更有用
  • 請求標頭(敏感欄位除外)
  • 回應標頭
  • 遠端 IP
  • 延遲

可觀測性

可以使用與標準相容的指標來監控您的網頁伺服器。
Prometheus 指標、開放遙測

請求處理

HTTP 伺服器使用自訂路由處理請求,自訂路由包含您定義順序的特定處理常式。可以為自訂錯誤處理定義單獨的錯誤路由。您在 HTTP 處理方面具有高度的彈性。請參閱下文以取得可用的 HTTP 處理常式模組。
可組合的路由(和單獨的錯誤處理路由)

請求篩選器

僅將處理常式應用於某些請求,方法是使用匹配器,匹配器根據各種屬性對請求進行分類。匹配器也用於篩選。它們是可擴充和可外掛的,因此您的路由可以有多精細和自訂是沒有限制的!某些匹配器支援正則表達式。所有都非常快速。並且匹配器可以組合在集合中,以便可以使用 AND、OR 和 NOT 邏輯將它們聯接起來。
  • Host
  • 路徑
  • 方法
  • 標頭
  • 協定
  • 遠端 IP
  • 任意 CEL 表達式
  • 檔案(存在、大小、修改日期)
  • HTTP 路由變數
  • 邏輯 NOT
  • 地理位置
  • 遠端主機

HTTP 處理常式

處理常式是可以組合在一起以精確地按照您想要的方式處理傳入請求的模組。處理常式模組與 Caddy 的其餘部分一樣,是可擴充和可外掛的。我們實際上無法在此處列出所有處理常式。

在實務中,處理常式與匹配器配對,匹配器根據各種屬性(例如其路徑、標頭、查詢字串、方法等)篩選或分類請求。這允許您選擇性地將所有這些處理常式應用於某些請求。

ACME 伺服器

Caddy 開箱即用,附帶一個可供生產環境使用的 ACME 伺服器,非常適合您的內部 PKI。輕鬆自動化基礎架構內的 mTLS 憑證。由 Smallstep 函式庫提供支援。

Authelia

使用 Authelia 保護路由安全。

身份驗證

使用可擴充的身份驗證模組驗證使用者。由身份驗證提供商擴充,如果任何已組態的提供商都無法驗證使用者身份,則此處理常式會傳回錯誤。標準中包含 HTTP 基本身份驗證,與其他伺服器不同,密碼在設定基本身份驗證時會進行雜湊處理(因為它本質上是一個密碼資料庫),從而增強安全性。
  • HTTP 基本身份驗證
  • JWT
  • Discord
  • 表單
  • SAML

進階身份驗證

憑藉全套身份驗證和授權功能,caddy-security 模組提供了各種穩健的身份驗證解決方案。
  • 基於表單
  • 本地
  • 基本
  • LDAP
  • OpenID Connect
  • OAuth 2
  • SAML

快取

輕鬆啟用快取以服務更多客戶端並提高效能。此快取模組符合 RFC 7234 標準,並支援基於標籤的快取清除、分散式和本機儲存、金鑰產生調整等等。支援多個後端!
  • Badger
  • Etcd
  • NutsDB
  • Olric
  • Redis

編碼

使用可外掛的編碼模組即時壓縮、編碼或以其他方式轉換 HTTP 回應。壓縮回應就像一行組態一樣簡單,並且編碼不會應用於已經採用壓縮格式或太小而不值得的回應。
  • Gzip
  • Zstandard (zstd)
  • Brotli

檔案伺服器

功能強大、彈性且有效率的靜態檔案伺服器,詳情如下所述。

Go 套件虛名路徑

一個簡單的處理常式,為 Go 套件實作虛名匯入路徑。

gRPC-Web 橋接

橋接/轉換 gRPC-Web 請求至 gRPC,供您的後端應用程式使用。

標頭操作

修改 HTTP 請求和回應標頭。在標頭欄位中新增、設定、刪除和取代子字串速度很快,但也支援正規表示式以供進階使用。回應標頭操作可以延遲到回應開始寫入的最後一刻,甚至可以根據回應狀態碼或標頭值設定條件。
  • 新增
  • 設定 (覆寫)
  • 刪除
  • 子字串取代

圖片篩選

即時對圖片執行調整。
  • 裁切
  • 符合
  • 翻轉
  • 調整大小
  • 旋轉
  • 銳化

映射

根據輸入值指派變數/佔位符值;類似於查閱表。

Mercure

讓您的 Caddy 實例成為 Mercure 中心:一個開放、簡單、快速、可靠且省電的即時通訊解決方案。

指標

公開一個 /metrics 端點,以便與 Prometheus 相容的系統和其他監控工具一起使用。

HTTP/2 伺服器推送

在使用 HTTP/2 時,在用戶端請求資源之前主動將資源推送給用戶端。(可能已被瀏覽器棄用,但 Caddy 仍然有一個有效的實作,在某些應用程式中很有用。)

速率限制

進階、企業級速率限制器,使用環形緩衝區和滑動視窗演算法實作,可根據區域金鑰大規模擴展。設定具有相同儲存體的 Caddy 實例叢集,以在您的伺服器群組中分配速率限制。不像其他企業伺服器那樣需要記憶體限制。
  • 本地或分散式
  • 多個區域
  • 緩衝區池化
  • 僅 1 個 goroutine
  • 可配置的 O(Kn) 記憶體管理
  • 狀態在重新載入後持續存在
  • 設定 Retry-After 標頭
  • 可選的抖動
  • 高度可程式化

請求 body 控制

透過拒絕過大的請求來限制請求 body 的大小。

反向代理

Caddy 具有世界一流的反向代理,在下面的章節中詳細說明。

重寫請求

在繼續處理請求之前,先對請求進行內部變更。這對於接受需要變更的請求以符合稍後的預期很有用。請求的各個方面都可以變更,例如方法和 URI。
  • 方法
  • URI (路徑、查詢字串)
  • 移除路徑前綴或後綴
  • 正規表示式支援
  • 智慧型 URL 編碼和正斜線處理

靜態回應

將靜態回應硬編碼到您的設定中,能夠設定狀態碼、標頭欄位和 body。(這通常用於回應 HTTP 重新導向。)然後可以優雅地關閉連線,或在需要時強制中止。

子路由

將處理常式分組到「子路由」中,將多個處理常式視為一個,使某些邏輯更容易理解。

範本

回應可以評估為範本,讓您能夠使用變數、if 語句、markdown 渲染 (支援 front matter) 等,將代理或靜態內容轉換為豐富的動態內容。

追蹤

支援使用 OpenTelemetry 的分散式追蹤。

變數

讀取和寫入可在處理請求時在內部使用的變數。

WebDAV

只需一兩行設定即可成為 WebDAV 伺服器。與大多數 WebDAV 用戶端相容。

反向代理

Caddy 擁有世界上最靈活的通用反向代理,具有進階的請求和回應處理、動態路由、健康檢查、負載平衡、斷路等功能。

Caddy 代理獨特之處在於其設計。只有代理面向用戶端的一側需要是 HTTP;與後端往返傳輸的底層可以使用任何協定來完成!

此外,我們的代理可以使用高度動態的上游伺服器進行程式設計。也就是說,可用的上游伺服器可以在進行中的請求期間變更!如果沒有可用的後端,Caddy 可以保留請求直到有一個後端可用。

高階代理功能

傳輸

傳輸是 Caddy 從後端取得回應的方式。Caddy 的代理可以透過使用替代傳輸模組,作為 HTTP 以外協定的前端。這允許 Caddy 從甚至不使用 HTTP 的後端產生 HTTP 回應!
  • HTTP
  • FastCGI
  • NTLM

負載平衡

選擇上游伺服器是任何現代反向代理的關鍵功能。Caddy 有多種內建的負載平衡策略可供選擇,以滿足任何生產服務。有些策略非常快速且輕量;其他策略根據用戶端或請求的屬性提供上游親和性;其他策略則透過計算連線數或使用隨機性和權重來力求平均分配。
  • 隨機
  • 隨機選擇 N 個
  • 最少連線數
  • 循環配置資源
  • 加權循環配置資源
  • 第一個可用
  • 遠端 IP hash
  • 用戶端 IP hash
  • URI hash
  • 查詢 hash
  • 標頭 hash
  • Cookie hash

斷路

斷路器模組可以在後端實際關閉之前暫時將其標記為關閉,以保持其運作。
基於延遲

健康檢查

健康檢查會偵測上游伺服器何時不可用。被動健康檢查從實際請求推斷狀態。主動健康檢查在背景中工作,與用戶端請求無關。
  • 主動
  • 被動

可觀測性

管理 API 公開一個端點,以檢索代理上游伺服器的流量計數和健康狀態。

上游來源

Caddy 可以透過多種方式取得上游伺服器列表。最常見的是將它們寫入配置中 (靜態)。其他方式是動態的,透過這種方式,會為每個請求傳回上游伺服器列表 (這些利用可配置的快取來增強效能)。
  • 靜態
  • 動態:A 記錄
  • 動態:SRV 記錄
  • 動態:多個來源組合

重試

可以重試請求,直到後端可用於成功處理請求。在此期間,即使請求仍在等待中,上游伺服器列表也可能會更新!

串流

回應可以直接串流到用戶端,或者為了獲得更好的線路效能,可以稍微緩衝並定期刷新。

受信任的代理

為了使用與代理相關的標頭,例如 X-Forwarded-For,您可以指定您信任的代理 IP 範圍列表。預設情況下,Caddy 不信任用戶端。

標頭操作

標頭可以在傳送到後端的請求和從後端傳回的回應中修改。這與一般 HTTP 伺服器的標頭處理常式類似,但這是應用於代理時。
  • 新增
  • 設定 (覆寫)
  • 刪除
  • 子字串取代

緩衝

代理可以選擇在刷新之前讀取整個 body。這會使用更多記憶體,但在某些情況下,某些後端應用程式或用戶端可能需要。
  • 請求
  • 回應

請求重寫

重寫與代理是不同的問題,通常是分開處理的,但有時您需要使用來自代理的資訊 (例如選擇的上游伺服器) 來重寫請求。Caddy 的代理允許您執行此操作。

回應攔截

預設情況下,Caddy 的代理只是將回應寫入用戶端。但是,您可以攔截上游伺服器的回應並以其他方式處理它。這包括僅比對某些回應並調用您指定的自訂處理常式鏈。

主動健康檢查

主動健康檢查預設假定後端已關閉,直到透過健康檢查確認為止。

HTTP 請求參數

主動健康檢查是針對上游伺服器上的 HTTP 端點執行的。您可以自訂這些 HTTP 請求的參數以適合您。
  • 路徑 & 查詢字串
  • 標頭

計時

您可以自訂執行主動健康檢查的間隔。

成功標準

每個主動健康檢查都可以自訂一組標準,以判斷健康或不健康狀態。
  • 回應逾時
  • HTTP 狀態碼
  • body 上的正規表示式比對

失敗安全

遇到錯誤和困難的後端有時可能會回應意外大的回應 body。Caddy 允許您限制此大小以保留代理資源。
限制回應大小

被動健康檢查

被動健康檢查預設假定後端已啟動,直到在代理請求過程中滿足失敗標準為止。

失敗標準

所有被動健康檢查都會計算連線失敗次數。此外,您可以設定更多在請求期間將後端視為健康的必要標準。
  • 超出並行請求限制
  • HTTP 狀態
  • 延遲

失敗記憶體

您可以自訂記住失敗的時間以及需要記憶體中有多少失敗才能將後端視為關閉。

HTTP 傳輸

這是預設的傳輸模組。它會建立代理的 HTTP 請求,以從後端取得 HTTP 回應。

DNS 解析器

預設使用系統解析器,但您可以為每個代理處理常式指定自訂 DNS 解析器。

TLS

Caddy 可以設定為支援與上游伺服器的 TLS (以前稱為 SSL)。
  • 自訂根 CA 池
  • 用戶端向後端驗證
  • 自訂握手逾時
  • 伺服器名稱指示 (SNI)
  • 重新協商層級
  • 從 TLS 中排除某些埠

連線池化

與後端的連線會池化,以實現最大效率和最小延遲。
  • HTTP Keep-Alive
  • 自訂探測間隔
  • 最大閒置連線數 (總數和每個主機)
  • 閒置連線逾時

壓縮

Caddy 可以壓縮與後端往返的請求。
Gzip

連線限制

您可以限制每個主機的連線數。

PROXY 協定

連接到上游伺服器時,同時支援 PROXY 協定 v1 和 v2。

逾時

可以設定各種逾時;有些具有合理的預設值。
  • 連線 (撥號)
  • RFC 6555 後備
  • 讀取回應標頭
  • Expect-continue
  • 讀取
  • 寫入

自訂緩衝區大小

如果您發現您的應用程式在某些設定下效能更好,請調整讀取/寫入緩衝區的大小。
  • 讀取緩衝區
  • 寫入緩衝區

HTTP 版本

Caddy 的代理支援與後端的多個 HTTP 版本。預設情況下,支援 HTTP/1.1 和 HTTP/2。
  • HTTP/1.1
  • HTTP/2
  • H2C (透過明文的 HTTP/2)

FastCGI 傳輸

FastCGI 通常用於透過 php-fpm 服務 PHP 應用程式。FastCGI 回應器可能需要關於正在執行的腳本的其他資訊,例如腳本名稱、相對於根目錄的路徑等,而 Caddy 的 FastCGI 傳輸會處理所有這些,並使其可配置。

高效

Caddy 的 FastCGI 用戶端實作已最佳化,可媲美以 C 語言編寫的不安全記憶體用戶端的效能,有時甚至超越其效能。

路徑分割

路徑可以分割,通常在副檔名處分割,以計算正確的 PATH_INFO 變數。

解析根符號連結

選擇性地要求宣告為符號連結的路徑在符號連結變更時更新,而無需重新啟動 php-fpm。

環境變數

從父環境讀取,並為您的 CGI 腳本設定自訂環境變數。

逾時

設定逾時以節省資源。
  • 撥號 (連線)
  • 讀取
  • 寫入

捕獲 stderr

Caddy 可以捕獲來自上游伺服器的 stderr 輸出,並記錄它們以提高可見性。

靜態檔案伺服器

Caddy 的檔案伺服器是為您的網站服務靜態檔案的首選方式。

這很簡單:指定一個根目錄來服務檔案,然後每個請求路徑都會自動附加到根目錄,以取得要服務的檔案的完整路徑。

核心加速

Caddy 盡可能繞過用戶空間緩衝區,以顯著提高檔案下載速度。
sendfile

虛擬檔案系統

預設情況下,Caddy 從您在本機磁碟上指定的目錄服務檔案,但此檔案存取是可插拔的,可以替換為任何虛擬化檔案系統模組。這允許您從任何檔案儲存區 (例如資料庫、雲端儲存或甚至直接嵌入在 Web 伺服器二進位檔案中的資產) 服務靜態檔案!
  • 本機磁碟
  • 嵌入式資產
  • Amazon AWS S3

預先壓縮的檔案

如果您的部署管線壓縮網站資源,Caddy 可以自動偵測它們,並以其「預先壓縮」編碼服務它們,以提高效率和更大的吞吐量。
  • Brotli
  • Zstandard
  • Gzip

隱藏檔案和資料夾

透過主動隱藏可能敏感的檔案和資料夾 (這些檔案和資料夾存在或可能存在於您的網站根目錄中),提高您的安全態勢。您可以指定個別檔案/資料夾路徑、檔案名稱 (無論其路徑如何),或 glob 比對以隱藏具有特定模式的檔案/資料夾。
確切路徑、檔案名稱、glob 比對

索引檔案名稱

索引檔案是在用戶端請求目錄時服務的檔案。要尋找的索引檔案的檔案名稱是可自訂的。如果請求的目錄中找不到索引檔案,則可以選擇性地啟用目錄瀏覽。
index.html, index.txt (可自訂)

條件請求

支援 Etag、Last-Modified 和相關標頭。
  • Etag
  • Last-Modified
  • If-Match
  • If-None-Match
  • If-Modified-Since
  • If-Unmodified-Since
  • If-Range

範圍請求

對於串流大型檔案和恢復下載很常見,請求檔案特定範圍的用戶端不會感到失望或驚訝。Caddy 正確處理帶有 Range 標頭的 HTTP 請求。

標準路徑

一般來說,單個檔案或目錄有多個 URI。例如:/、/index.html 和 /index.html/ 代表相同的資源。Caddy 使用 HTTP 重新導向來強制執行路徑標準化 (從檔案中移除尾部斜線,並為目錄新增斜線)。

Pass-thru 模式

有時您只想在檔案存在時才服務它,否則繼續處理鏈中的下一個處理常式,而不是向用戶端傳回錯誤。

檔案瀏覽器

Caddy 的檔案伺服器透過其現代化的檔案瀏覽器而生動起來,該瀏覽器在行動裝置和桌面上看起來都很有吸引力。它比任何其他標準 HTTP 檔案伺服器都具有更多功能和實用性!

資料夾列表

當資料夾中不存在索引檔案 (如下) 時,顯示資料夾中的檔案列表。
確切路徑、檔案名稱、glob 比對

日夜主題

色彩配置會自動調整以符合系統主題,無論是淺色還是深色,以避免讓您眼花撩亂或難以閱讀。
  • 淺色模式
  • 深色模式

依欄排序

透過黏性欄排序快速提取每個目錄的資訊,並更快地找到項目。
  • 檔案/資料夾
  • 名稱
  • 大小
  • 修改日期

篩選

每次頁面載入都會自動將游標聚焦在搜尋框上,因此您可以開始輸入檔案名稱並立即篩選大型列表。

版面配置

檔案可以以不同的版面配置顯示,具體取決於您想要如何檢視列表。例如,網格檢視非常適合圖庫。
  • 列表
  • 網格

響應式設計

頁面寬度會流暢地調整以適應各種尺寸的螢幕。連結的尺寸足夠大,可以在觸控螢幕上輕鬆點擊,同時資訊密度也足夠高,仍然很有用。

JSON API

帶有 Accept-Encoding: application/json 標頭的請求將以 JSON payload 回覆,以便以程式化或腳本方式存取您的檔案列表。

可自訂的列表範本

如果預設範本不合適,或者您想要增添情趣,請自訂瀏覽範本,使其外觀和行為符合您的需求!

檔案大小視覺化

檔案大小由其後面的橫條長度表示,讓您可以快速輕鬆地找到異常的大型和小型檔案,或一目了然地比較相對大小。

檔案類型圖示

檔案伺服器可識別數十種常見檔案類型,並顯示相關圖示,以便在掃描頁面時更輕鬆地識別。

Caddy 是一個持續發展的專案,具有大量功能。此頁面尚未全面列出 Caddy 提供的所有功能和優點,因為有太多值得一提。我們歡迎在 GitHub 上貢獻