入门指南
欢迎使用Caddy!本教程会带你了解使用Caddy的基础,并在较高层次上建立整体认知。
目标:
- 🔲 运行守护进程
- 🔲 体验API
- 🔲 给Caddy加载配置
- 🔲 验证配置
- 🔲 编写Caddyfile
- 🔲 使用配置适配器
- 🔲 用初始配置启动
- 🔲 对比JSON与Caddyfile
- 🔲 对比API与配置文件
- 🔲 后台运行
- 🔲 配置无停机重载
前提条件:
- 基本的终端/命令行技能
- 基本的文本编辑器技能
caddy和curl已在你的PATH中
如果你是通过包管理器安装Caddy的,Caddy可能已经以服务形式在运行。若是如此,请先停止该服务,再继续本教程。
先运行它:
caddy
没有子命令时,caddy只会显示帮助信息。忘记命令用法时,这个入口很有用。
要以前台守护进程方式启动Caddy,请使用run子命令:
caddy run
这个命令会一直阻塞,但它现在在做什么?此刻……什么都没做。默认情况下,Caddy配置("config")是空的。我们可以在另一个终端通过管理API验证:
curl localhost:2019/config/
要让Caddy真正工作起来,需要给它配置。方式有很多;下一节我们先用curl向/load端点发一个POST请求。
你的第一个配置
为准备这个请求,我们先写一份配置。Caddy配置的核心就是一个JSON文档。
把下面内容保存到JSON文件(例如caddy.json):
{ "apps": { "http": { "servers": { "example": { "listen": [":2015"], "routes": [ { "handle": [{ "handler": "static_response", "body": "Hello, world!" }] } ] } } } } }
然后上传它:
curl localhost:2019/load \
-H "Content-Type: application/json" \
-d @caddy.json
再发一个GET请求,确认Caddy已应用新配置:
curl localhost:2019/config/
在浏览器访问localhost:2015,或用curl测试:
curl localhost:2015
Hello, world!
如果你看到了_Hello, world!_,说明成功了。始终确认配置按预期工作是个好习惯,尤其是在部署到生产前。
你的第一个Caddyfile
仅仅输出Hello World,这样做显得工作量有点大。
配置Caddy的另一种方式是使用Caddyfile。上面那份JSON配置,可以简洁写成:
:2015 respond "Hello, world!"
把它保存为当前目录下名为Caddyfile(无扩展名)的文件。
如果Caddy还在运行,先停止它(Ctrl+C),然后执行:
caddy adapt
如果你的Caddyfile在其他位置,或者文件名不是Caddyfile:
caddy adapt --config /path/to/Caddyfile
你会看到JSON输出!这里发生了什么?
我们刚刚使用了配置适配器把Caddyfile转换成了Caddy原生JSON结构。
虽然我们可以拿到输出后再发一次API请求,但这些步骤可省略,因为caddy命令本身就能帮你完成。若当前目录有名为Caddyfile的文件,且未指定其他配置,Caddy会自动加载它、完成适配并立即运行。
现在当前目录已经有Caddyfile了,再执行一次caddy run:
caddy run
如果你的Caddyfile在其他位置:
caddy run --config /path/to/Caddyfile
(若文件名不是以“Caddyfile”开头,还需显式指定--adapter caddyfile。)
现在再访问你的网站,会看到它已经工作了!
如你所见,用初始配置启动Caddy有多种方式:
- 当前目录中名为Caddyfile的文件
--config参数(可搭配--adapter)--resume参数(前提是此前已加载过配置)
JSON vs. Caddyfile
现在你知道了:Caddyfile本质上只是先转换为JSON。
Caddyfile看起来比JSON更易用,但是否应该始终使用它?两种方式各有利弊,最终取决于你的需求和场景。
| JSON | Caddyfile |
|---|---|
| 易于生成 | 便于手工编写 |
| 易于编程 | 自动化较别扭 |
| 表达能力极强 | 表达能力中等 |
| 覆盖Caddy全部功能 | 覆盖Caddy大部分功能 |
| 支持配置遍历 | 不能在Caddyfile内部遍历 |
| 支持局部配置变更 | 只能整份变更 |
| 可导出 | 不可导出 |
| 兼容所有API端点 | 兼容部分API端点 |
| 文档可自动生成 | 文档为手工编写 |
| 通用性强 | 相对小众 |
| 更高效 | 计算开销更高 |
| 略显枯燥 | 更有趣 |
| 了解更多:JSON结构 | 了解更多:Caddyfile文档 |
你需要根据自己的场景决定哪种更合适。
需要注意:JSON和Caddyfile(以及其他受支持的配置适配器)都可配合Caddy API使用。但若使用JSON,你能获得完整的Caddy功能与API能力;若使用配置适配器,通过API加载或修改配置的方式仅限/load端点。
API vs. 配置文件
你还需要决定你的工作流是偏API还是偏CLI。(同一台服务器上你_可以_同时用API和配置文件,但不推荐:最好保持单一事实来源。)
| API | 配置文件 |
|---|---|
| 通过HTTP请求修改配置 | 通过Shell命令修改配置 |
| 易于扩展 | 难以扩展 |
| 手工管理困难 | 手工管理容易 |
| 非常有趣 | 也很有趣 |
| 了解更多:API教程 | 了解更多:Caddyfile教程 |
选择API工作流还是配置文件工作流,与是否使用配置适配器是正交关系:你可以使用JSON并存成文件后走CLI;反过来,也可以通过API使用Caddyfile。
但多数人会采用JSON+API或Caddyfile+CLI这两种组合。
如你所见,Caddy非常适合多种场景与部署方式!
Start, stop, run
由于Caddy是服务器程序,它会持续运行。这意味着执行caddy run后,终端不会返回,除非进程被终止(通常是Ctrl+C)。
虽然caddy run最常见且通常是推荐方式(尤其在做系统服务时),你也可以用caddy start让Caddy在后台运行:
caddy start
这样你就能继续使用当前终端,这在某些交互式无头环境里很方便。
之后你需要自行停止进程,因为Ctrl+C不能帮你停后台进程:
caddy stop
也可以调用API的/stop端点。
Reloading config
你的服务支持配置无停机重载/变更。
所有用于加载或修改配置的API端点都支持零停机、平滑生效。
但在命令行使用时,很多人会想用Ctrl+C停掉服务,再重启以应用新配置。不要这么做:服务启停与配置变更是两件事,这样会造成停机。
应改用caddy reload命令做平滑变更:
caddy reload
它本质上仍是调用底层API:加载配置(必要时先适配为JSON),然后无停机地平滑替换活动配置。
如果加载新配置出现错误,Caddy会回滚到最后一份可用配置。