文档
一个 项目

命令行

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

caddy <命令> [<参数...>]

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

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

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

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

快速开始:caddycaddy helpman caddy(如果已安装)


子命令

caddy adapt

caddy adapt
	[-c, --config <路径>]
	[-a, --adapter <名称>]
	[-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 命令时获得 tab 补全或自动补全(或类似功能,取决于您的 shell)。

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

caddy environ

caddy environ

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

caddy file-server

caddy file-server
	[-r, --root <路径>]
	[--listen <地址>]
	[-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 指定要搜索预压缩侧车文件的编码格式。可以重复多次。请参阅 file_server 指令 了解更多信息。

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

caddy file-server export-template

caddy file-server export-template

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

caddy fmt

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

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

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

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

--diff 导致输出与输入进行比较,并带有 -+ 的行将有所不同。请注意,未更改的行用两个空格进行对齐,这不是有效的补丁格式;它只是作为视觉工具。

caddy hash-password

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

方便地对纯文本密码进行哈希处理。结果哈希写入 stdout,作为可以直接在您的 Caddy 配置中使用的格式。

--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 实例一个新的配置。这具有与 POST 到 /load 端点 相同的效果,但此命令对于围绕配置文件的简单工作流程更方便。与 stopstartrun 命令相比,此单个命令是更改/重新加载正在运行的配置的正确、语义方式。

因为此命令使用 API,管理端点必须不处于禁用状态。

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

--adapter 指定要使用的配置适配器,如果任何。如果 --config 文件名以 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 头;Field: value 格式是预期的。此标志可以多次使用。

--body 指定响应体。或者,体可以从 stdin 管道。

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

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

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

在没有指定选项的情况下,此命令监听随机可用端口并回答 HTTP 请求,响应为空 200。监听地址可以用 --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}}"

服务器地址:[::]:2000
服务器地址:[::]:2001
服务器地址:[::]:2002
服务器地址:[::]:2003
服务器地址:[::]: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 并无限期阻止;即 "daemon" 模式。

--config 指定要立即加载和使用的初始配置文件。如果 -,配置从 stdin 读取。如果没有指定配置,Caddy 将运行空白配置并使用默认设置为 admin API 端点,这可以用于为其提供新配置。作为特殊情况,如果当前工作目录有名为 "Caddyfile" 的文件,并且插入了 caddyfile 配置适配器(默认),则该文件将加载并用于配置 Caddy,即使没有命令行标志。

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

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

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

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

--resume 使用最后加载的自动保存配置,覆盖 --config 标志(如果存在)。使用此标志可确保配置通过机器重启或进程重启保持持久性。它在 API-centric 部署中最有用。

--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 进程(除了停止命令的进程)并导致它退出。它使用 POST /stop 端点管理 API 执行优雅关闭。

此请求的地址可以通过 --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)运行时预先安装证书,如果服务器进程作为非特权用户(例如通过 systemd)运行时。您可能需要使用此命令与 sudo 到 unix 系统。

默认情况下,此命令安装 Caddy 的默认 CA(即 "local") 的根证书。您可以使用 --ca 标志指定其他 CA。

此命令将尝试连接到 Caddy 的 admin 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 标志。
  • 通过从 admin API 使用 GET /pki/ca/<id>/certificates 端点获取根证书。这是默认行为,如果未给出标志。

如果使用管理 API,则 CA ID 默认为 "local"。您可以使用 --ca 标志指定其他 CA。您可以使用 --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 类似,用相同的模块安装最新版本,但 plus 作为参数列出的包,如果它们存在于当前二进制文件中。运行 caddy list-modules --packages 查看非标准模块的包名称列表,这些模块包含在当前二进制文件中。

caddy remove-package

⚠️ 实验性

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

caddy upgrade 类似,用相同的模块安装最新版本,但 without 作为参数列出的包,如果它们存在于当前二进制文件中。运行 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 $? 获取最后一个命令的退出代码。