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