文档
一个 项目

命令行

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

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

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

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

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

--flags 可能具有单字母快捷方式,如 -f

快速入门:caddycaddy helpman 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]
	[-t, --templates]
	[--access-log]
	[-v, --debug]

启动一个简单但可用于生产环境的静态文件服务器。

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

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

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

--browse 将在请求没有索引文件的目录时启用目录列表。

--templates 将启用模板渲染。

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

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

此命令禁用管理 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>]
	[-s, --salt <string>]

对明文密码进行哈希处理的便捷方法。生成的哈希值将作为可直接在 Caddy 配置中使用的格式写入 stdout。

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

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

--salt 仅在算法需要外部盐(如 scrypt)时使用。

请注意,scrypt 已弃用。请改用 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 实例提供新的配置。这与将文档 POST 到 /load 端点 的效果相同,但此命令对于围绕配置文件的简单工作流程来说很方便。与 stopstartrun 命令相比,此单个命令是更改/重新加载正在运行的配置的正确语义方法。

因为此命令使用 API,所以管理端点不能被禁用。

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

--adapter 指定要使用的配置适配器(如果有)。

--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 标头;预期使用 Field: value 格式。此标志可以多次使用。

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

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

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

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

如果没有指定选项,此命令将在随机可用的端口上监听,并使用空的 200 响应回复 HTTP 请求。监听地址可以使用 --listen 标志自定义,并将始终打印到标准输出。如果监听地址包含端口范围,则将启动多个服务器。

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

可以通过 3 种方式给出主体:标志、命令的最终(且无名)参数或通过管道传输到标准输入(如果标志和参数未设置)。对主体支持有限的 模板评估,使用以下变量

变量 描述
.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 反向代理

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]

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

只需将来自 --from 地址的 HTTP(S) 流量传送到 --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 指定一个初始配置文件,以便立即加载并使用。如果为 -,则从标准输入读取配置。如果未指定配置,Caddy 将使用空白配置运行,并使用 管理 API 端点 的默认设置,这些设置可用于向其提供新的配置。作为特殊情况,如果当前工作目录中有一个名为“Caddyfile”的文件,并且已插入 caddyfile 配置适配器(默认),则即使没有命令行标志,也会加载并使用该文件来配置 Caddy。

--adapter 是加载初始配置时要使用的配置适配器名称(如果有)。如果 --config 文件名以“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 标志不支持 - 从标准输入读取配置。

不建议在系统服务或 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 的文件名。如果为 -,则输出将写入标准输出。

caddy storage import

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

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

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

caddy trust

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

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

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

默认情况下,此命令安装 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 是要验证的配置文件。如果为 -,则从标准输入读取配置。默认情况下为当前目录中的 Caddyfile(如果有)。

--adapter 是要使用的配置适配器的名称,如果配置文件不是 Caddy 的原生 JSON 格式。如果配置文件以 Caddyfile 开头,则默认情况下使用 caddyfile 适配器。

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

caddy 版本

caddy version

打印版本并退出。

信号

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

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

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

退出代码

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

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

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