所有功能
你可能需要坐下来看看。

这种颜色 显示的功能由可选插件提供。

概述

Caddy 本质上是一个配置管理系统,可以运行各种应用程序,例如 HTTP 服务器、TLS 证书管理器、PKI 设施等等。它可以通过称为配置模块的插件进行扩展。

Caddy 拥有灵活强大的 HTTP 反向代理、在线配置 API 和健壮、可用于生产环境的静态文件服务器,并且默认情况下通过自动 TLS 证书为所有站点提供 HTTPS 服务。

总体程序技术规格

语言

语言选择对于 Web 服务器至关重要。语言会影响开发速度和易用性、性能、测试、部署复杂性、生态系统可靠性、依赖项、工具、错误处理和可靠性等等。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,并且比其他 Web 服务器使用的 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 掩码
  • 哈希值
  • 正则表达式替换

存储

资产和状态(包括证书和 OCSP 钉扎)存储在可配置的存储后端中。实际上,配置了相同存储的多个 Caddy 实例被视为集群的一部分,并且可以自动协调。
  • 文件系统
  • 嵌入式(内存中)
  • Postgres
  • Redis
  • Vault
  • Consul

命令行界面

Caddy 的 CLI 不仅有用——它还很方便。虽然大多数服务器 CLI 只是运行进程并重新加载配置,但 Caddy 的 CLI 更加努力,可以帮助您轻松管理现代 Web 服务器。

插件可以注册自己的子命令来扩展 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 同时兼顾了人类可读性和可编程性。您会发现它是一个强大的 Web 服务器盟友。
JSON

配置适配器

您始终可以使用其他格式编写配置,并且使用配置适配器,Caddy 会为您隐式地将其转换为 JSON,以便您可以使用您喜欢的格式。
  • Caddyfile
  • JSON 5
  • JSON-C
  • NGINX Conf
  • YAML
  • CUE
  • TOML
  • HCL
  • Dhall
  • MySQL

人性化的配置

Caddyfile 是大多数用户最喜欢的用手编写 Web 服务器配置的方式,因为它的语法宽松,同时还设计了结构,使其易于阅读和编写。它会自动转换为 JSON。
Caddyfile

导出

Caddy 的管理 API 允许您通过简单的 GET 请求以 JSON 格式访问运行时配置。

配置 API

Caddy 通过 API 端点接收其配置,该端点可以接受 JSON 或任何其他格式(它有相应的配置适配器)。

配置文件

如果您更喜欢使用正常的 shell 命令来管理配置,Caddy 的 CLI 会为您包装 API 端点。

自动 HTTPS

我们的旗舰功能,由 CertMagic 提供支持。Caddy 是第一个也是唯一一个默认情况下启用 HTTPS 的主要服务器,并且会自动获取和续订所有站点的证书。

完全原生的集成自动 HTTPS 远远优于任何需要外部工具或 cron 作业的解决方案。Caddy 的证书维护是业界最好的,因为它比任何其他解决方案都更加健壮、可靠和可扩展。Caddy 简化了您的基础设施,而不是使其复杂化。

当然,您可以尝试使用 Certbot 和 cron 作业部署 10 万个网站,但如果它本身没有崩溃,那么 Web 服务器就会崩溃。只有 Caddy 旨在水平和垂直扩展 TLS 证书。

永远不要手动生成 CSR。永远不要点击电子邮件中的链接下载证书。永远不要(错误地)配置您的 Web 服务器以使用它们。永远不要错过每隔几个月证书到期前逐个提醒您续订证书。您甚至不必考虑证书或 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 钉书钉和会话票证密钥。这将减少客户的延迟并提高可扩展性。
  • 获取和续订证书
  • 加载现有证书
  • OCSP 钉书钉
  • 会话票证密钥 (STEK)

将 HTTP 重定向到 HTTPS

默认情况下,HTTP 请求将重定向到 HTTPS。
自动重定向

OCSP

OCSP 指示证书何时被吊销。服务器应将 OCSP 响应钉书钉到证书,为客户提供更好的安全性和隐私。Caddy 是第一个也是唯一一个默认情况下自动执行此操作的服务器。它还缓存响应以应对 OCSP 响应程序中断,并在其集群中共享它们。如果需要,所有这些都可以禁用。
带有缓存的自动 OCSP 钉书钉

必须钉书钉

如果 CA 支持,Caddy 可以获取强制 OCSP 钉书钉的证书。这可能会在吊销的情况下提供更高程度的安全保障。

吊销处理

吊销的证书会自动被替换。由于 Caddy 钉书钉并刷新 OCSP 响应,因此它可以检测到您的证书是否已被吊销,如果是,它将替换 i

会话票证硬化

如果攻击者窃取了用于加密会话票证的密钥,则 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 客户端。Caddy 自 Let's Encrypt 公开发布之前就开始使用 ACME,并且 Caddy 与任何兼容 ACME 的 CA 合作。

兼容性

某些 ACME 客户端只在 Let's Encrypt 上经过测试。Caddy 保证与所有支持 ACME 的 CA 兼容。
所有符合 RFC 8555 的证书颁发机构,例如
  • Let's Encrypt
  • ZeroSSL
  • Google 信任服务
  • BuyPass
  • DigiCert
  • GlobalSign
  • SSL.com
  • Smallstep

测试端点

默认情况下,如果在获取证书失败后,Caddy 会回退到 CA 的测试或暂存端点(如果有),以避免触及 CA 强制执行的生产速率限制。这也可以是您专门为验证 DNS 配置而设置的 ACME 服务器。
Let's Encrypt(其他可配置)

外部帐户绑定

可以选择配置外部帐户绑定 (EAB),以使 Caddy 能够与需要您在他们那里拥有单独帐户的 CA 合作。

挑战类型

Caddy 支持所有主要的 ACME 挑战类型,用于 Web PKI,并且还可以扩展以支持其他类型。
  • 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 交互时信任的根证书;这对于内部 PKI 很有用,在内部 PKI 中,信任是在没有公共 CA 的情况下建立的。

首选链

当 CA 提供多个证书链时,Caddy 使您能够自定义要下载和使用的证书链。
  • 最小
  • 根的 CommonName
  • 任何的 CommonName

HTTP 服务器

Caddy 的 HTTP 服务器是独一无二的:强大、可扩展、高效且现代。

HTTP 版本

Caddy 的 HTTP 服务器支持所有主要版本的 HTTP,并默认启用它们(除了 H2C,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 保持活动间隔

全双工通信

并非所有客户端都支持 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 通常在同一个套接字上提供多个站点,因此 Caddy 会自动启用保护措施,以确保您的站点安全,即使其中任何一个启用了 TLS 客户端身份验证。
验证 TLS ServerName 和 HTTP Host 标头是否匹配

访问日志

启用零分配、结构化访问日志,以最终了解客户端请求和响应。使用 Caddy 的内置日志记录配置或使用第三方模块进行自定义。
  • 比通用日志格式 (CLF) 更实用
  • 请求标头(除了敏感字段)
  • 响应标头
  • 远程 IP
  • 延迟

可观察性

可以使用符合标准的指标监控您的 Web 服务器。
Prometheus 指标、开放式遥测

请求处理

HTTP 服务器使用自定义路由处理请求,这些路由由您定义的特定处理程序组成。可以为自定义错误处理定义单独的错误路由。您在 HTTP 处理方面具有高度的灵活性。有关可用的 HTTP 处理程序模块,请参见下文。
可组合路由(以及单独的错误处理路由)

请求过滤器

使用匹配器将处理程序应用于某些请求,匹配器根据各种属性对请求进行分类。匹配器也用于过滤。它们是可扩展的和可插拔的,因此您的路由可以是无限的特定和自定义!某些匹配器支持正则表达式。所有都非常快。匹配器可以组合成集合,因此它们可以与 AND、OR 和 NOT 逻辑结合使用。
  • 主机
  • 路径
  • 方法
  • 标头
  • 协议
  • 远程 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 标头
  • 可选抖动
  • 高度可编程

请求主体控制

通过拒绝过大的请求来限制请求主体的尺寸。

反向代理

Caddy 拥有世界一流的反向代理,将在下面一节中详细介绍。

重写请求

在继续处理请求之前,对请求进行内部更改。这对于接受需要更改以符合以后期望的请求很有用。请求的各个方面都可以更改,例如方法和 URI。
  • 方法
  • URI(路径、查询字符串)
  • 剥离路径前缀或后缀
  • 支持正则表达式
  • 智能 URL 编码和正斜杠处理

静态响应

将静态响应硬编码到您的配置中,并能够设置状态代码、标头字段和主体。(这通常用于响应 HTTP 重定向。)然后可以优雅地关闭连接,或者在需要时强制中止连接。

子路由

将处理程序分组到一个“子路由”中,将多个处理程序视为一个处理程序,使某些逻辑更容易理解。

模板

响应可以作为模板进行评估,这使您能够将代理或静态内容转换为包含变量、if 语句、markdown 渲染(支持前置内容)等的丰富动态内容。

跟踪

支持使用 OpenTelemetry 进行分布式跟踪。

变量

读取和写入可以在处理请求时在内部使用的变量。

WebDAV

只需一两行配置即可成为 WebDAV 服务器。与大多数 WebDAV 客户端兼容。

反向代理

Caddy 拥有世界上最灵活的通用反向代理,具有先进的请求和响应处理、动态路由、健康检查、负载均衡、断路器等功能。

Caddy 代理的独特之处在于其设计。只有代理的客户端部分需要是 HTTP;与后端往返的底层传输可以使用任何协议来实现!

此外,我们的代理可以使用高度动态的上游进行编程。也就是说,可用的上游可以在飞行中的请求期间发生变化!如果没有任何后端可用,Caddy 可以保留请求,直到有后端可用为止。

高级代理功能

传输

传输是 Caddy 如何从后端获取响应的方式。Caddy 的代理可以使用备用传输模块作为除 HTTP 之外的其他协议的前端。这使 Caddy 能够从甚至不使用 HTTP 的后端生成 HTTP 响应!
  • HTTP
  • FastCGI
  • NTLM

负载均衡

选择上游是任何现代反向代理的关键功能。Caddy 提供了多种内置负载均衡策略供您选择,以满足任何生产服务的需要。某些策略非常快且轻量级;其他策略根据客户端或请求的属性提供上游亲和性;其他策略则通过计算连接或使用随机性和权重来努力实现均匀分布。
  • 随机
  • 随机选择 N
  • 最少连接
  • 循环
  • 加权循环
  • 第一个可用
  • 远程 IP 哈希
  • 客户端 IP 哈希
  • URI 哈希
  • 查询哈希
  • 标头哈希
  • Cookie 哈希

断路器

断路器模块可以在后端实际宕机之前将其暂时标记为宕机,以使其保持正常运行。
基于延迟

健康检查

健康检查检测上游何时不可用。被动健康检查从实际请求中推断状态。主动健康检查在后台运行,与客户端请求无关。
  • 主动
  • 被动

可观察性

管理 API 公开了端点以检索代理上游的流量计数和健康状态。

上游来源

Caddy 可以通过多种方式获取上游列表。最常见的方法是将它们写入配置(静态)。其他方法是动态的,即为每个请求返回上游列表(这些方法利用可配置的缓存来提高性能)。
  • 静态
  • 动态:A 记录
  • 动态:SRV 记录
  • 动态:多个来源组合

重试

请求可以重试,直到有后端可用以成功处理请求。在此期间,即使请求仍在挂起,上游列表也可能会更新!

流式传输

响应可以直接流式传输到客户端,或者为了获得更好的线路性能,可以稍微缓冲并定期刷新。

受信任的代理

为了使用代理相关的标头(如 X-Forwarded-For),您可以指定一个受信任代理的 IP 范围列表。默认情况下,Caddy 不信任客户端。

标头操作

标头可以在请求向上游发送时和响应从上游返回时进行修改。这类似于通用 HTTP 服务器的标头处理程序,但这是在代理过程中应用的。
  • 添加
  • 设置(覆盖)
  • 删除
  • 子字符串替换

缓冲

代理可以选择在刷新之前读取整个主体。这会使用更多内存,但在某些情况下,某些后端应用程序或客户端可能需要这样做。
  • 请求
  • 响应

请求重写

重写与代理是不同的问题,通常是分开处理的,但有时您需要使用代理中的信息(如选择的上游)来重写请求。Caddy 的代理允许您执行此操作。

响应拦截

默认情况下,Caddy 的代理只是将响应写入客户端。但是,您可以拦截上游的响应并以其他方式处理它。这包括仅匹配某些响应并调用您指定的自定义处理程序链。

主动健康检查

主动健康检查默认情况下假设后端已宕机,直到健康检查确认情况并非如此。

HTTP 请求参数

主动健康检查针对上游的 HTTP 端点执行。您可以自定义这些 HTTP 请求的参数以适合您的需要。
  • 路径和查询字符串
  • 端口
  • 标头

计时

您可以自定义执行主动健康检查的间隔。

成功条件

每个主动健康检查都可以使用一组条件进行自定义,以确定健康或不健康状态。
  • 响应超时
  • HTTP 状态代码
  • 主体上的正则表达式匹配

故障安全

遇到错误和困难的后端有时可能会响应意外的大型响应主体。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 回退
  • 读取响应标头
  • 期望继续
  • 读取
  • 写入

自定义缓冲区大小

如果您发现您的应用程序在某些设置下性能更好,可以调整读/写缓冲区的大小。
  • 读取缓冲区
  • 写入缓冲区

HTTP 版本

Caddy 的代理支持与后端使用多个 HTTP 版本。默认情况下,支持 HTTP/1.1 和 HTTP/2。
  • HTTP/1.1
  • HTTP/2
  • H2C(HTTP/2 over cleartext)

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 可以自动检测它们并以其“预压缩”编码提供它们,以提高效率和吞吐量。
  • Gzip
  • Brotli
  • Zstandard

隐藏文件和文件夹

通过主动隐藏可能存在于您的站点根目录中的潜在敏感文件和文件夹来提高您的安全态势。您可以指定单个文件/文件夹路径、文件名(无论其路径如何)或 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 重定向来强制执行路径规范化(从文件删除尾部斜杠,并为目录添加尾部斜杠)。

直通模式

有时您只想在文件存在时提供文件,否则继续处理链中的下一个处理程序,而不是向客户端返回错误。

文件浏览器

Caddy 的文件服务器通过其现代文件浏览器变得活跃起来,该浏览器在移动设备和台式机上看起来都很吸引人。它比任何其他标准 HTTP 文件服务器都具有更多功能和实用性!

文件夹列表

当该文件夹中不存在索引文件(如下)时,显示该文件夹中的文件列表。
精确路径、文件名、球状匹配

昼夜主题

颜色方案会自动调整以匹配系统主题,无论是浅色还是深色,以避免使您眼花缭乱或难以阅读。
  • 浅色模式
  • 深色模式

按列排序

使用粘性列排序快速提取有关每个目录的信息并更快地查找项目。
  • 文件/目录
  • 名称
  • 大小
  • 修改日期

过滤器

每次页面加载都会自动将光标聚焦到搜索框上,因此您可以开始键入文件名并立即过滤大型列表。

布局

文件可以以不同的布局显示,具体取决于您希望如何查看列表。例如,网格视图非常适合画廊。
  • 列表
  • 网格

响应式设计

页面宽度会流畅地调整以适应所有尺寸的屏幕。链接的大小足以在触摸屏上轻松点击,同时仍然信息密集到足以有用。

JSON API

带有 Accept-Encoding: application/json 标头的请求将以 JSON 负载进行回复,以供以编程方式或通过脚本访问您的文件列表。

可自定义的列表模板

如果默认模板不合适,或者您想让事情变得更有趣,请自定义浏览模板,使其以您想要的方式显示和运行!

文件大小可视化

文件大小由它们后面的条形长度指示,使您能够快速轻松地找到异常大的文件和小的文件,或者一目了然地比较相对大小。

文件类型图标

文件服务器识别数十种常见文件类型并显示关联的图标,以便在扫描页面时更容易识别。

Caddy 是一个充满活力的项目,拥有大量功能。此页面尚未全面列出 Caddy 提供的所有功能和优势,因为要提到的内容太多了。我们欢迎您在 GitHub 上 贡献