caddy使用Caddyfile管理服务

本教程将教你 HTTP Caddyfile 的基础知识,以便你可以快速轻松地生成外观美观、功能齐全的站点配置。

目标:

  • 🔲 第一个站点

  • 🔲 静态文件服务器

  • 🔲 模板

  • 🔲 压缩

  • 🔲 多个站点

  • 🔲 匹配器

  • 🔲 环境变量

  • 🔲 注释

先决条件:

  • 基本的终端/命令行技能

  • 基本的文本编辑器技能

  • caddy
     在你的 PATH 中

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

首先输入的是你站点的地址:

1
2
3
4
localhost
```

然后按下回车键,输入你希望它执行的操作。在本教程中,将你的 Caddyfile 修改如下:

localhostrespond “Hello, world!”

1
2
3
4
  
保存后运行 Caddy(由于这是一个培训教程,我们将使用 --watch
 标志,以便自动应用对 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://localhost/caddy.html

输出结果为:
页面加载时间:{{now | date "Mon Jan 2 15:04:05 MST 2006"}}
1
2
  
等一下。我们应该看到今天的日期。为什么没有显示呢?这是因为服务器尚未被配置为评估模板!很容易修复,只需在 Caddyfile 中添加一行,使其看起来像这样:

localhosttemplatesfile_server browse

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

页面加载时间: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

1
2
  
它等同于以下内容:

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 中添加注释或说明,可以使用以 #
 开头的注释:

这是一个注释的开头

  
  

![江达小记](/images/wechatmpscan.png)