所有功能特性
您可能需要坐下来仔细阅读。

此颜色标注的功能特性由可选插件提供。

概述

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,从而平衡了人类可读性和可编程性。您会发现它是您 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 作业部署 100,000 个站点,但是如果这本身没有崩溃,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 订书钉与缓存

Must-Staple

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

吊销处理

吊销的证书会自动被替换。由于 Caddy 会钉住并刷新 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 客户端更高的可靠性和更多的生产经验。Caddy 自 Let's Encrypt 公开可用之前就开始使用 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 交互时信任的根证书;这对于内部 PKI 很有帮助,在内部 PKI 中,信任是在没有公共 CA 的情况下建立的。

首选链

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

续订计划

Caddy 选择保守的时间范围来续订证书,如果 ACME CA 提供 ACME 续订信息 (ARI),Caddy 也会从中获取指导。
  • 内部
  • 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 保活间隔

全双工通信

并非所有客户端都支持 HTTP/1 的并发读取和写入,但可以为需要它的某些客户端和应用程序启用。
  • 可为 HTTP/1 配置
  • HTTP/2 的默认设置

错误处理

Caddy 让您可以完全控制错误处理,从而为您的客户端提供最佳/期望的体验。
自定义错误路由

TLS 终止

使用合理的默认设置终止 TLS(以前称为“SSL”),您可以自定义这些设置,以便对 TLS 握手进行细粒度控制。您可以根据各种因素(如服务器名称 (SNI) 或远程 IP)为客户端分配策略。
  • TLS 1.2
  • TLS 1.3
  • 客户端身份验证(TLS 相互身份验证;mTLS)
  • 客户端身份验证模式:请求、需要、如果给定则验证、需要并验证
  • 密码套件
  • 曲线
  • ALPN
  • 限制协议版本
  • 默认 SNI
  • 回退 SNI

跨站点安全

Caddy 通常在同一套接字上服务多个站点,因此如果其中任何一个站点启用了 TLS 客户端身份验证,Caddy 会自动启用保护措施以确保您的站点安全。
验证 TLS 服务器名称和 HTTP Host 标头是否匹配

访问日志

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

可观测性

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

请求处理

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

请求过滤器

仅对某些请求应用处理程序,方法是使用匹配器,匹配器根据各种属性对请求进行分类。匹配器也用于过滤。它们是可扩展和可插拔的,因此您的路由可以有多么具体和自定义没有限制!一些匹配器支持正则表达式。所有匹配器都非常快。并且匹配器可以组合成集合,以便可以使用 AND、OR 和 NOT 逻辑将它们连接起来。
  • 主机
  • 路径
  • 方法
  • 标头
  • 协议
  • 远程 IP
  • 任意 CEL 表达式
  • 文件(存在、大小、修改日期)
  • HTTP 路由变量
  • 逻辑非
  • 地理位置
  • 远程主机

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 回退
  • 读取响应标头
  • Expect-continue
  • 读取
  • 写入

自定义缓冲区大小

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

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

隐藏文件和文件夹

通过主动隐藏站点根目录中存在或可能存在的潜在敏感文件和文件夹,提高您的安全态势。您可以指定单个文件/文件夹路径、文件名(无论其路径如何)或 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 上做出贡献