文档
一个 项目

Caddyfile 教程

本教程将教你 HTTP Caddyfile 的基础,使你能够快速且轻松地编写美观且功能完善的站点配置。

目标:

  • 🔲 第一个站点
  • 🔲 静态文件服务器
  • 🔲 模板
  • 🔲 压缩
  • 🔲 多站点
  • 🔲 匹配器
  • 🔲 环境变量
  • 🔲 注释

先决条件:

  • 基本终端/命令行技能
  • 基本文本编辑器技能
  • caddy 已在你的 PATH 中

创建一个名为 Caddyfile 的新文本文件(无扩展名)。

你首先应该输入的是你站点的地址

localhost

然后按回车并输入你希望它执行的操作。对于本教程,让你的 Caddyfile 如下:

localhost

respond "Hello, world!"

保存并运行 Caddy(由于这是一个训练教程,我们将使用 --watch 标志,以便对 Caddyfile 的更改自动应用):

caddy run --watch

第一次会要求你输入密码。这样做是为了让 Caddy 能通过 HTTPS 提供你的站点。

在浏览器中打开 localhost 查看你的 Web 服务器是否正常工作,并带有 HTTPS!

这并不是特别有趣,所以我们把静态响应换成带目录列表的file server

localhost

file_server browse

保存你的 Caddyfile,然后刷新浏览器标签页。你应该会看到文件列表,或者如果当前目录中有索引文件则会看到 HTML 页面。

添加功能

让我们为文件服务器做点有趣的事情:提供一个模板化页面。创建一个新文件并粘贴以下内容:

<!DOCTYPE html>
<html>
	<head>
		<title>Caddy tutorial</title>
	</head>
	<body>
		Page loaded at: {{now | date "Mon Jan 2 15:04:05 MST 2006"}}
	</body>
</html>

将其保存为当前目录下的 caddy.html,然后在浏览器中加载它: https://localhost/caddy.html

输出为:

Page loaded at: {{now | date "Mon Jan 2 15:04:05 MST 2006"}}

等一下。我们应该看到今天的日期。为什么没有生效?这是因为服务器尚未配置为评估模板!很容易修复,只需在 Caddyfile 中添加一行,使其如下所示:

localhost

templates
file_server browse

保存后,重新加载浏览器标签页。你应该会看到:

Page loaded at: Thu Jun 25 02:40:15 UTC 2026

使用 Caddy 的templates 模块,你可以对静态文件做很多有用的事,例如包含其他 HTML 文件、发起子请求、设置响应头、处理数据结构等!

最好用一种现代且高效的压缩算法来压缩响应。让我们使用 encode 指令启用 Gzip 和 Zstandard 支持:

localhost

encode
templates
file_server browse

这就是让一个半高级、可投入生产的站点上线运行的基本流程!

当你准备好开启自动 HTTPS 时,只需用你的域名替换站点地址(在本教程中为 localhost)。更多信息请参阅我们的HTTPS 快速入门指南

多站点

按照我们当前的 Caddyfile,只能有一个站点定义!只有第一行可以是站点的地址(或地址列表),文件的其余部分必须是该站点的指令。

但要添加更多站点非常简单!

我们目前的 Caddyfile:

localhost

encode
templates
file_server browse

等同于:

localhost {
	encode
	templates
	file_server browse
}

不同之处在于第二种写法允许我们添加更多站点。

通过将站点块包裹在大括号 { } 中,我们可以在同一个 Caddyfile 中定义多个不同的站点。

例如:

:8080 {
	respond "I am 8080"
}

:8081 {
	respond "I am 8081"
}

当使用大括号包裹站点块时,只有地址出现在大括号外,只有指令出现在大括号内。

对于共享相同配置的多个站点,你可以添加更多地址,例如:

:8080, :8081 {
	...
}

你可以定义任意多个不同的站点,只要每个地址都是唯一的。

匹配器

我们可能希望某些指令只应用于特定请求。例如,假设我们既想使用文件服务器又想使用反向代理,但显然我们不能在每个请求上同时使用两者!文件服务器会用静态文件写回响应,或者反向代理会将请求传给后端并写回后端的响应。

下面这个配置不会像我们希望的那样工作(由于指令顺序reverse_proxy 会优先):

localhost

file_server
reverse_proxy 127.0.0.1:9005

实际上,我们可能只想对 API 请求使用反向代理,即基路径为 /api/ 的请求。这可以通过添加一个匹配器标记轻松完成:

localhost

reverse_proxy /api/* 127.0.0.1:9005
file_server

好了;现在对于所有以 /api/ 开头的请求,反向代理将被优先使用。

我们刚添加的 /api/* 部分称为 匹配器标记。你可以通过它以斜杠 / 开头且出现在指令之后来识别它(当然你也可以在指令的文档中查证)。

匹配器非常强大。你可以声明命名匹配器并像 @name 那样使用它们,以匹配不仅仅是请求路径的内容!在继续之前花点时间了解更多关于匹配器 的内容吧!

环境变量

Caddyfile 适配器允许在解析 Caddyfile 之前替换环境变量

首先,在运行 Caddy 的同一个 shell 中设置一个环境变量:

export SITE_ADDRESS=localhost:9055

然后你可以在 Caddyfile 中像这样使用它:

{$SITE_ADDRESS}

file_server

在解析 Caddyfile 之前,它将被扩展为:

localhost:9055

file_server

你可以在 Caddyfile 的任何位置、对任意数量的标记使用环境变量。

注释

最后一件对你非常有帮助的事:如果你想在 Caddyfile 中添加备注或注释,可以使用以 # 开头的注释:

# this starts a comment

进一步阅读