
本教程将教你 HTTP Caddyfile 的基础知识,以便你可以快速轻松地生成外观美观、功能齐全的站点配置。
目标:
-
🔲 第一个站点
-
🔲 静态文件服务器
-
🔲 模板
-
🔲 压缩
-
🔲 多个站点
-
🔲 匹配器
-
🔲 环境变量
-
🔲 注释
先决条件:
-
基本的终端/命令行技能
-
基本的文本编辑器技能
-
caddy
在你的 PATH 中
创建一个名为 Caddyfile
(无扩展名)的新文本文件。
首先输入的是你站点的地址:
1 2 3 4
| localhost ``` 然后按下回车键,输入你希望它执行的操作。在本教程中,将你的 Caddyfile 修改如下:
|
localhostrespond “Hello, world!”
1 2 3 4
| 保存后运行 Caddy(由于这是一个培训教程,我们将使用 标志,以便自动应用对 Caddyfile 的更改):
|
caddy run --watch
1 2 3 4 5 6
| 第一次运行时,系统会提示你输入密码。这是为了让 Caddy 能够通过 HTTPS 提供你的站点服务。 在浏览器中打开 localhost,查看你的 Web 服务器是否正常运行,且支持 HTTPS! 这并不令人兴奋,所以让我们将静态响应更改为启用目录列表的文件服务器:
|
localhostfile_server browse
1 2 3 4 5
| 保存你的 Caddyfile,然后刷新浏览器标签。你应该会看到当前目录中的文件列表,或者如果有索引文件,则会看到一个 HTML 页面。 ## 添加功能 让我们对文件服务器做一些有趣的事情:提供一个模板化的页面。创建一个新文件,并将以下内容粘贴进去:
|
Caddy 教程 页面加载时间:{{now | date "Mon Jan 2 15:04:05 MST 2006"}}
1 2 3 4 5 6
| 将该文件保存为当前目录下的 caddy.html ,然后在浏览器中加载它: https: 输出结果为:
|
页面加载时间:{{now | date "Mon Jan 2 15:04:05 MST 2006"}}
1 2
| 等一下。我们应该看到今天的日期。为什么没有显示呢?这是因为服务器尚未被配置为评估模板!很容易修复,只需在 Caddyfile 中添加一行,使其看起来像这样:
|
localhosttemplatesfile_server browse
页面加载时间:2025年2月11日星期二 21:45:07 UTC
1 2 3 4 5
| 借助 Caddy 的模板模块,你可以对静态文件做很多事情,例如包含其他 HTML 文件、发起子请求、设置响应头、处理数据结构等! 为了提高性能,最好使用快速且现代的压缩算法对响应进行压缩。让我们使用 encode 指令启用 Gzip 和 Zstandard 支持:
|
localhostencode zstd gziptemplatesfile_server browse
1 2 3 4 5 6 7 8 9 10 11 12
| 这就是将一个半高级、生产就绪的站点投入运行的基本过程! 当你准备好启用自动 HTTPS 时,只需将站点地址(本教程中的 localhost )替换为你的域名即可。更多信息请参阅我们的 HTTPS 快速入门指南。 ## 多个站点 在当前的 Caddyfile 中,我们只能有一个站点定义!文件的第一行只能是站点的地址,而文件的其余部分必须是该站点的指令。 但很容易让我们能够添加更多站点! 到目前为止,我们的 Caddyfile 如下:
|
localhostencode zstd gziptemplatesfile_server browse
localhost { encode zstd gzip templates file_server browse}
1 2 3 4 5 6 7
| 不过,第二种方式允许我们添加更多站点。 通过使用大括号 { } 包裹站点块,我们可以在同一个 Caddyfile 中定义多个不同的站点。 例如:
|
:8080 { respond “我是 8080”}:8081 { respond “我是 8081”}
1 2 3 4
| 当使用大括号包裹站点块时,只有地址出现在大括号之外,而指令则出现在大括号之内。 对于共享相同配置的多个站点,你可以添加更多地址,例如:
|
:8080, :8081 { …}
1 2 3 4 5 6 7 8
| 然后你可以根据需要定义任意数量的不同站点,只要每个地址是唯一的即可。 ## 匹配器 我们可能希望仅对某些请求应用某些指令。例如,假设我们既想使用文件服务器,又想使用反向代理,但我们显然不能对每个请求都同时使用这两种服务!要么文件服务器会用静态文件写入响应,要么反向代理会将请求传递给后端并写回其响应。 以下配置不会按我们期望的方式工作(reverse_proxy 会因指令顺序而优先执行):
|
localhostfile_serverreverse_proxy 127.0.0.1:9005
1 2 3
| 实际上,我们可能只想对 API 请求使用反向代理,即以 /api/ 为基本路径的请求。通过添加匹配器令牌,很容易实现这一点:
|
localhostreverse_proxy /api/* 127.0.0.1:9005file_server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 好了,现在反向代理将优先处理所有以 /api/ 开头的请求。 我们刚刚添加的 /api/* 部分称为 **匹配器令牌** 。你可以通过它以正斜杠 / 开头且紧随指令的特点来判断它是一个匹配器令牌(当然,你也可以随时查阅指令的文档以确认)。 匹配器非常强大。你可以声明命名匹配器,并像使用 @name 那样使用它们,以匹配不仅仅是请求路径的内容!花点时间了解一下匹配器,然后再继续学习!
Caddyfile 适配器允许在解析 Caddyfile 之前替换环境变量。 首先,在运行 Caddy 的相同 shell 中设置一个环境变量:
|
export SITE_ADDRESS=localhost:9055
1 2
| 然后你可以在 Caddyfile 中这样使用它:
|
{$SITE_ADDRESS}file_server
1 2
| 在解析 Caddyfile 之前,它将被扩展为:
|
localhost:9055file_server
1 2 3 4 5
| 你可以在 Caddyfile 的任何位置使用环境变量,用于任意数量的标记。 最后,还有一个你可能会觉得很有帮助的事项:如果你想在 Caddyfile 中添加注释或说明,可以使用以 # 开头的注释:
|
这是一个注释的开头
