文档
一个 项目

命令行

Caddy 有一个标准的类 Unix 命令行界面。基本用法是

caddy <command> [<args...>]

<尖括号> 表示将被您的输入替换的参数。

[方括号] 表示可选参数。(圆括号) 表示必需参数。

省略号 ... 表示延续,即一个或多个参数。

--标志 可能有一个单字母快捷方式,如 -f

快速开始:caddycaddy help,或 man caddy(如果已安装)


子命令

caddy adapt

caddy adapt
	[-c, --config <path>]
	[-a, --adapter <name>]
	[-p, --pretty]
	[--validate]

将配置适配为 Caddy 的原生 JSON 配置结构,并将输出写入 stdout,以及将任何警告写入 stderr,然后退出。

--config 是配置文件的路径。如果省略,则假定为当前目录中的 Caddyfile(如果存在);否则,此标志是必需的。

--adapter 指定要使用的配置适配器;默认为 caddyfile

--pretty 将使用缩进格式化输出,以提高人类可读性。

--validate 将加载并配置适配的配置以检查有效性(但它实际上不会开始运行配置)。

请注意,成功适配的配置仍可能无法通过验证。例如,使用此 Caddyfile

localhost

tls cert_notexist.pem key_notexist.pem

尝试适配它

caddy adapt --config Caddyfile

它成功而没有错误。然后尝试

caddy adapt --config Caddyfile --validate
adapt: validation: loading app modules: module name 'tls': provision tls: loading certificates: open cert_notexist.pem: no such file or directory

即使该 Caddyfile 可以无错误地适配为 JSON,但实际的证书和/或密钥文件不存在,因此验证失败,因为该错误在配置阶段出现。因此,验证是比适配更强的错误检查。

示例

要将 Caddyfile 适配为易于阅读和手动调整的 JSON

caddy adapt --config /path/to/Caddyfile --pretty

caddy build-info

caddy build-info

打印 Go 提供的关于构建的信息(主模块路径、包版本、模块替换)。

caddy completion

caddy completion [bash|zsh|fish|powershell]

生成 shell 补全脚本。这允许您在键入 caddy 命令时获得制表符补全或自动补全(或类似功能,取决于您的 shell)。

要获取将此脚本安装到您的特定 shell 中的说明,请运行 caddy help completioncaddy completion -h

caddy environ

caddy environ

打印 caddy 看到的环境变量,然后退出。在调试 init 系统或进程管理器单元(如 systemd)时非常有用。

caddy file-server

caddy file-server
	[-r, --root <path>]
	[--listen <addr>]
	[-d, --domain <example.com>]
	[-b, --browse]
	[--reveal-symlinks]
	[-t, --templates]
	[--access-log]
	[-v, --debug]
	[--no-compress]
	[-p, --precompressed]

启动一个简单但生产就绪的静态文件服务器。

--root 指定根文件路径。默认为当前工作目录。

--listen 接受监听器地址。默认为 :80,除非使用了 --domain,则默认为 :443

--domain 将仅通过该主机名提供文件,并且 Caddy 将尝试通过 HTTPS 提供它,因此如果它是公共域名,请确保首先正确配置任何公共 DNS。默认端口将更改为 443。

--browse 如果请求没有索引文件的目录,将启用目录列表。

--reveal-symlinks 将在目录列表中显示符号链接的目标,当 --browse 启用时。

--templates 将启用模板渲染。

--access-log 启用请求/访问日志。

--debug 启用详细日志记录。

--no-compress 禁用压缩。默认情况下,启用 Zstandard 和 Gzip 压缩。

--precompressed 指定要搜索预压缩 sidecar 文件的编码格式。可以重复多次以指定多种格式。有关更多信息,请参阅 file_server 指令

此命令禁用管理 API,使其更容易在本地开发机器上运行多个实例。

caddy file-server export-template

caddy file-server export-template

将默认文件浏览模板导出到 stdout

caddy fmt

caddy fmt [<path>]
	[-w, --overwrite]
	[-d, --diff]

格式化或美化 Caddyfile,然后退出。结果将打印到 stdout,除非使用了 --overwrite,并且如果存在任何差异,将以代码 1 退出。

<path> 指定 Caddyfile 的路径。如果为 -,则从 stdin 读取输入。如果省略,则假定为当前目录中名为 Caddyfile 的文件。

--overwrite 使结果写入到输入文件,而不是打印到终端。如果输入不是常规文件,则此标志无效。

--diff 使输出与输入进行比较,并且差异行将以 -+ 作为前缀。请注意,未更改的行以两个空格作为前缀以对齐,并且这不是有效的补丁格式;它仅用作可视化工具。

caddy hash-password

caddy hash-password
	[-p, --plaintext <password>]
	[-a, --algorithm <name>]

哈希明文密码的便捷方式。生成的哈希值以可直接在 Caddy 配置中使用的格式写入 stdout。

--plaintext 是密码的明文形式。如果省略,则假定为交互模式,并且将向用户显示提示以手动输入密码。

--algorithm 可以是 bcrypt 或任何已安装的哈希算法。默认为 bcrypt

caddy help

caddy help [<command>]

打印 CLI 帮助文本,可以选择针对特定的子命令,然后退出。

caddy list-modules

caddy list-modules
	[--packages]
	[--versions]
	[-s, --skip-standard]

打印已安装的 Caddy 模块,可以选择包含来自其关联 Go 模块的包和/或版本信息,然后退出。

在某些脚本情况下,打印所有标准模块可能显得冗余,因此您可以使用 --skip-standard 从输出中省略这些模块。

注意:由于 Go 中的一个错误,只有当 Caddy 作为依赖项而不是作为主模块构建时,版本信息才可用。使用 xcaddy 可以更轻松地实现这一点。

caddy manpage

caddy manpage
	(-o, --directory <path>)

为 Caddy 命令生成手册页/文档页,并将它们写入指定路径的目录。此命令的输出可以由 man 命令读取。

--directory(必需)是要将手册页写入的目录的路径。如果该目录不存在,则将创建它。

生成后,通常需要安装手册页。此过程因平台而异,但在典型的 Linux 系统上,它类似于这样

$ caddy manpage --directory man
$ gzip -r man/
$ sudo cp man/* /usr/share/man/man8/
$ sudo mandb

然后您可以运行 man caddy(或 man caddy-* 用于子命令)以在终端中阅读文档。

手册页是与我们网站上内容不同的文档。我们的网站有更全面的文档,并且经常更新。

caddy reload

caddy reload
	[-c, --config <path>]
	[-a, --adapter <name>]
	[--address <interface>]
	[-f, --force]

为正在运行的 Caddy 实例提供新的配置。这与向 /load 端点 POST 文档具有相同的效果,但此命令对于围绕配置文件的简单工作流程非常方便。与 stopstartrun 命令相比,此单个命令是更改/重新加载运行配置的正确语义方式。

由于此命令使用 API,因此不得禁用管理端点。

--config 是要应用的配置文件。如果为 -,则从 stdin 读取配置。如果未指定,它将尝试当前工作目录中名为 Caddyfile 的文件,如果存在,则使用 caddyfile 配置适配器适配它;否则,如果没有要加载的配置文件,则会出错。

--adapter 指定要使用的配置适配器(如果有)。如果 --config 文件名以 Caddyfile 开头或以 .caddyfile 结尾,则不需要此标志,这将假定使用 caddyfile 适配器。否则,如果提供的配置文件不是 Caddy 的原生 JSON 格式,则此标志是必需的。

如果管理端点未在默认地址上监听,并且与提供的配置文件中的地址不同,则需要使用 --address。请注意,目前仅支持 TCP 地址。

--force 将导致即使指定的配置与 Caddy 已经运行的配置相同也进行重新加载。这对于强制 Caddy 重新配置其模块可能很有用,这可能会产生副作用,例如:手动重新加载 TLS 证书。

caddy respond

caddy respond
	[-s, --status <code>]
	[-H, --header "<Field>: <value>"]
	[-b, --body <content>]
	[-l, --listen <addr>]
	[-v, --debug]
	[--access-log]
	[<status|body>]

启动一个或多个简单的、硬编码的 HTTP 服务器,这些服务器对于开发、暂存和某些生产用例非常有用。它对于验证或调试 HTTP 客户端、脚本甚至负载均衡器非常有用。

--status 是要返回的 HTTP 状态代码。

--header 添加一个 HTTP 标头;期望的格式为 字段: 值。此标志可以多次使用。

--body 指定响应正文。或者,正文可以从 stdin 管道输入。

--listen 是监听器地址,可以是 Caddy 识别的任何 网络地址,并且可以包含端口范围以启动多个服务器。

--debug 启用详细调试日志记录。

--access-log 启用访问/请求日志记录。

在未指定任何选项的情况下,此命令在随机可用端口上监听,并使用空的 200 响应来应答 HTTP 请求。可以使用 --listen 标志自定义监听地址,并且始终会打印到 stdout。如果监听地址包含端口范围,则将启动多个服务器。

如果给出了最后一个未命名的参数,则如果它是 3 位数字,则将其视为状态代码(与 --status 标志相同)。否则,它将用作响应正文(与 --body 标志相同)。--status--body 标志将始终覆盖此参数。

可以通过 3 种方式给出正文:一个标志、命令的最后一个(和未命名的)参数,或管道输入到 stdin(如果标志和参数未设置)。正文支持有限的 模板评估,具有以下变量

变量 描述
.N 服务器编号
.Port 监听器端口
.Address 监听器地址

示例

在随机端口上的空 200 响应

caddy respond

带有正文的 HTTP 响应

caddy respond "Hello, world!"

多个服务器和模板

$ caddy respond --listen :2000-2004 "I'm server {{.N}} on port {{.Port}}"

Server address: [::]:2000
Server address: [::]:2001
Server address: [::]:2002
Server address: [::]:2003
Server address: [::]:2004

$ curl 127.0.0.1:2002
I'm server 2 on port 2002

管道输入维护页面

cat maintenance.html | caddy respond \
	--listen :80 \
	--status 503 \
	--header "Content-Type: text/html"

caddy reverse-proxy

caddy reverse-proxy
	[-f, --from <addr>]
	(-t, --to <addr>)
	[-H, --header-up "<Field>: <value>"]
	[-d, --header-down "<Field>: <value>"]
	[-c, --change-host-header]
	[-r, --disable-redirects]
	[-i, --internal-certs]
	[-v, --debug]
	[--access-log]
	[--insecure]

一个简单但生产就绪的反向代理。适用于快速部署、演示和开发。

只需将 HTTP(S) 流量从 --from 地址传输到 --to 地址。可以通过重复标志来指定多个 --to 地址。至少需要一个 --to 地址。--to 地址可以具有端口范围,作为扩展到多个上游服务器的快捷方式。

除非地址中另有指定,否则如果给出了主机名,则 --from 地址将被假定为 HTTPS,而 --to 地址将被假定为 HTTP。

如果 --from 地址具有主机或 IP,Caddy 将尝试使用证书通过 HTTPS 提供代理服务(除非被 HTTP 方案或端口覆盖)。

如果提供 HTTPS 服务

  • --disable-redirects 可用于避免绑定到 HTTP 端口。

  • --internal-certs 可用于强制使用内部 CA 颁发证书,而不是尝试颁发公共证书。

对于代理

  • --header-up 可用于设置要发送到上游服务器的请求标头。

  • --header-down 可用于设置要发送回客户端的响应标头。

  • --change-host-header 将请求中的 Host 标头设置为上游服务器的地址,而不是默认为传入的 Host 标头。

    这是 --header-up "Host: {http.reverse_proxy.upstream.hostport}" 的快捷方式

  • --insecure 禁用与上游服务器的 TLS 验证。警告:此选项通过不验证上游服务器的证书来禁用安全性。

  • --debug 启用详细日志记录。

此命令禁用管理 API,使其更容易在本地开发机器上运行多个实例。

caddy run

caddy run
	[-c, --config <path>]
	[-a, --adapter <name>]
	[--pidfile <file>]
	[-e, --environ]
	[--envfile <file>]
	[-r, --resume]
	[-w, --watch]

运行 Caddy 并无限期阻塞;即“守护进程”模式。

--config 指定要立即加载和使用的初始配置文件。如果为 -,则从 stdin 读取配置。如果未指定任何配置,Caddy 将使用空白配置运行,并为 管理 API 端点 使用默认设置,可用于向其馈送新配置。作为特殊情况,如果当前工作目录中有一个名为 “Caddyfile” 的文件,并且插入了 caddyfile 配置适配器(默认),则即使没有任何命令行标志,该文件也将被加载并用于配置 Caddy。

--adapter 是加载初始配置时要使用的配置适配器的名称(如果有)。如果 --config 文件名以 Caddyfile 开头或以 .caddyfile 结尾,则不需要此标志,这将假定使用 caddyfile 适配器。否则,如果提供的配置文件不是 Caddy 的原生 JSON 格式,则此标志是必需的。任何警告都将打印到日志中,但请注意,任何没有错误的适配都将立即使用,即使存在警告。如果您想首先查看适配结果,请使用 caddy adapt 子命令。

--pidfile 将 PID 写入指定的文件。

--environ 在启动之前打印出环境变量。这与 caddy environ 命令相同,但不会在打印后退出。

--envfile 从指定的文件加载环境变量,格式为 KEY=VALUE。支持以 # 开头的注释;键可以以 export 为前缀;值可以用双引号括起来(双引号内部可以转义);支持多行值。

--resume 使用上次加载的自动保存的配置,覆盖 --config 标志(如果存在)。使用此标志可保证配置在机器重启或进程重启时的持久性。它在以 API 为中心的部署中最有用。

--watch 将监视配置文件并在更改后自动重新加载它。⚠️ 此功能仅适用于本地开发环境!

caddy start

caddy start
	[-c, --config <path>]
	[-a, --adapter <name>]
	[--envfile <file>]
	[--pidfile <file>]
	[-w, --watch]

caddy run 相同,但在后台运行。此命令仅阻塞到后台进程成功运行(或运行失败),然后返回。

注意:标志 --config 不支持使用 - 从 stdin 读取配置。

不建议在系统服务或 Windows 上使用此命令。在 Windows 上,子进程将保持附加到终端,因此关闭窗口将强制停止 Caddy,这并不明显。请考虑 作为服务 运行 Caddy。

启动后,您可以使用 caddy stopPOST /stop API 端点来退出后台进程。

caddy stop

caddy stop
	[--address <interface>]
	[-c, --config <path> [-a, --adapter <name>]]

优雅地停止正在运行的 Caddy 进程(除了 stop 命令的进程)并使其退出。它使用管理 API 的 POST /stop 端点来执行优雅关闭。

可以使用 --address 标志或从给定的 --config 自定义此请求的地址,如果正在运行的实例的管理 API 未使用默认监听地址。

如果您想停止当前配置但不希望退出进程,请使用 caddy reload 和空白配置,或 DELETE /config/ 端点。

caddy storage

⚠️ 实验性功能

允许导出和导入 Caddy 配置的数据存储的内容。

当需要从一个 存储模块 转换到另一个存储模块时,这很有用,方法是从旧的存储模块导出,更新您的配置,然后导入到新的存储模块中。

以下命令可用于在一个步骤中复制不同模块之间的存储,使用旧的和新的配置,将导出命令的输出通过管道传输到导入命令。

$ caddy storage export -c Caddyfile.old -o- |
  caddy storage import -c Caddyfile.new -i-

caddy storage export

caddy storage export
	-c, --config <path>
	[-o, --output <path>]

--config 是要加载的配置文件。这是必需的,以便连接到正确的存储模块。

--output 是要写入 tarball 的文件名。如果为 -,则将输出写入 stdout。

caddy storage import

caddy storage import
	-c, --config <path>
	-i, --input <path>

--config 是要加载的配置文件。这是必需的,以便连接到正确的存储模块。

--input 是要从中读取的 tarball 的文件名。如果为 -,则从 stdin 读取输入。

caddy trust

caddy trust
	[--ca <id>]
	[--address <interface>]
	[-c, --config <path> [-a, --adapter <name>]]

将 Caddy 的 PKI 应用程序 管理的 CA 的根证书安装到本地信任存储中。

Caddy 将尝试在其首次生成根证书时自动将其安装到本地信任存储中,但如果 Caddy 没有写入信任存储的适当权限,则可能会失败。如果服务器进程以非特权用户身份运行(例如通过 systemd),则此命令对于在使用证书之前预先安装证书是必要的。您可能需要使用 sudo 在 Unix 系统上运行此命令。

默认情况下,此命令安装 Caddy 默认 CA(即 “local”)的根证书。您可以使用 --ca 标志指定另一个 CA 的 ID。

此命令将尝试连接到 Caddy 的 管理 API 以获取根证书,使用 GET /pki/ca/<id>/certificates 端点。您可以显式指定 --address,或使用 --config 标志从您的配置中加载管理地址,如果正在运行的实例的管理 API 未使用默认监听地址。

您还可以将 caddy 二进制文件与此命令一起使用,以在网络中的其他机器上安装证书,如果管理 API 可以被其他机器访问 - 如果这样做,请小心不要将管理 API 暴露给不受信任的客户端。

caddy untrust

caddy untrust
	[-p, --cert <path>]
	[--ca <id>]
	[--address <interface>]
	[-c, --config <path> [-a, --adapter <name>]]

从本地信任存储中移除根证书的信任。

此命令取消信任;它不一定会从信任存储中完全删除根证书。因此,重复信任和取消信任新证书可能会填满信任数据库。

此命令不会删除或修改 Caddy 配置的存储中的证书文件。

此命令可以通过两种方式使用

  • 通过使用 --cert 标志指定要取消信任的根证书的直接路径。
  • 通过使用 GET /pki/ca/<id>/certificates 端点从 管理 API 获取根证书。如果没有给出任何标志,这是默认行为。

如果使用管理 API,则 CA ID 默认为 “local”。您可以使用 --ca 标志指定另一个 CA 的 ID。您可以显式指定 --address,或使用 --config 标志从您的配置中加载管理地址,如果正在运行的实例的管理 API 未使用默认监听地址。

caddy upgrade

⚠️ 实验性功能

caddy upgrade
	[-k, --keep-backup]

使用 我们的下载页面 中的最新版本替换当前的 Caddy 二进制文件,并安装相同的模块,包括 Caddy 网站上注册的所有第三方插件。

升级不会中断正在运行的服务器;目前,该命令仅替换磁盘上的二进制文件。如果我们能找到一种好的方法来做到这一点,将来可能会发生变化。

升级过程具有容错能力;当前二进制文件首先被备份(复制在当前二进制文件旁边),如果出现任何问题,则自动恢复。如果您希望在升级过程完成后保留备份,可以使用 --keep-backup 选项。

如果您的用户没有写入可执行文件的权限,则此命令可能需要提升的权限。

caddy add-package

⚠️ 实验性功能

caddy add-package <packages...>
	[-k, --keep-backup]

类似于 caddy upgrade,使用最新版本替换当前的 Caddy 二进制文件,并安装相同的模块,加上 作为参数列出的包包含在新二进制文件中。从 我们的下载页面 查找您可以安装的软件包列表。每个参数都应该是完整的软件包名称。

例如

caddy add-package github.com/caddy-dns/cloudflare

caddy remove-package

⚠️ 实验性功能

caddy remove-package <packages...>
	[-k, --keep-backup]

类似于 caddy upgrade,使用最新版本替换当前的 Caddy 二进制文件,并安装相同的模块,但不包括 作为参数列出的包(如果它们存在于当前二进制文件中)。运行 caddy list-modules --packages 以查看当前二进制文件中包含的非标准模块的软件包名称列表。

caddy validate

caddy validate
	[-c, --config <path>]
	[-a, --adapter <name>]
	[--envfile <file>]

验证配置文件,然后退出。此命令反序列化配置,然后加载和配置其所有模块,就像要启动配置一样,但实际上并未启动配置。这暴露了在加载或配置阶段出现的配置错误,并且是比仅仅将配置序列化为 JSON 更强的错误检查。

--config 是要验证的配置文件。如果为 -,则从 stdin 读取配置。默认为当前目录中的 Caddyfile(如果有)。

--adapter 是要使用的配置适配器的名称。如果 --config 文件名以 Caddyfile 开头或以 .caddyfile 结尾,则不需要此标志,这将假定使用 caddyfile 适配器。否则,如果提供的配置文件不是 Caddy 的原生 JSON 格式,则此标志是必需的。

--envfile 从指定的文件加载环境变量,格式为 KEY=VALUE。支持以 # 开头的注释;键可以以 export 为前缀;值可以用双引号括起来(双引号内部可以转义);支持多行值。

caddy version

caddy version

打印版本并退出。

信号

Caddy 捕获某些信号并忽略其他信号。信号可以启动特定的进程行为。

信号 行为
SIGINT 优雅退出。再次发送信号以立即强制退出。
SIGQUIT 立即退出 Caddy,但仍会清理存储中的锁,因为这很重要。
SIGTERM 优雅退出。
SIGUSR1 忽略。对于配置更新,请使用 caddy reload 命令或 API
SIGUSR2 忽略。
SIGHUP 忽略。

优雅退出意味着不再接受新连接,并且现有连接将在套接字关闭之前被耗尽。宽限期可能适用(并且是可配置的)。一旦宽限期结束,连接将被强制终止。在优雅关闭期间,将清理存储中的锁以及各个模块需要释放的其他资源。

退出代码

Caddy 在进程退出时返回一个代码

代码 含义
0 正常退出。
1 启动失败。不要自动重启进程;除非进行更改,否则它很可能会再次出错。
2 强制退出。Caddy 被强制退出,未清理资源。
3 退出失败。Caddy 在清理期间退出并出现一些错误。

在 bash 中,您可以使用 echo $? 获取最后一个命令的退出代码。