点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章
Caddyfile是Caddy的核心配置文件,它的设计,关乎着我们使用,开发者的解析以及扩展,所以本篇着重的介绍Caddy是如何设计一个Caddyfile的,我们也可以从中学到如何设计一个配置文件,并且让它更好的通用,更好的解析。
其实设计如此复杂的一个配置文件,已经和设计一门编程语言,很接近了。
结构
我前面的系统文章中,你也看到了如何使用Caddyfile的指令等功能,来满足我们的需求的。在我们写Caddyfile的时候,是遵循一定的规范的,哪些地方要怎么写,谁可以包含谁,这些规范就构成了Caddyfile的结构。
这张图是了解Caddyfile的神器,它定了Caddy的规范以及结构,让我们可以很方面的使用Caddyfile。现在,我来介绍下里面的一些关键点:
看到最顶部的红色框圈出来的这部分了吗?这是一个全局配置,它在Caddyfile的最顶部,用于配置一些通用的全局信息。当然它并不是必须的,你也可以不用配置它。
第二部分的 snippet
是一个可以复用的片段,你可以在其他地方通过 import
来引入它,这非常适用于你的Caddyfile中有很多重复配置的情况。它和全局配置的差别在于 {
前面有一对小括号,用于定义可复用片段的名字,这样你才可以在其他地方通过这个名字引用。下面我通过一个例子来说明它的使用,如下所示:
(static_file){
root * /var/www/mysite
file_server
}
www.example.com{
import static_file
}
www.example.com{
import static_file
}
接下来就是 Site Block
了,也就是定义你的站点的块,在Apache中叫虚拟主机。写到这里你可以看到,Caddyfile只有这三个顶级的定义块,一个全局配置、一个可复用的片段、一个就是站点配置,其他所有的配置,都要放在这三个顶级的配置中。
你可以通过站点块定义多个站点,但是他们之间没什么关系。如果你只有一个站点,你可以省略站点后面的大括号,比如下面两种定义是等价的:
localhost
reverse_proxy /api/* localhost:9001
file_server
等价于:
localhost {
reverse_proxy /api/* localhost:9001
file_server
}
因为整个Caddyfile中只有这么一个站点,所以大括号是可选的。
在一个Caddyfile中,你可以至少得定义一个站点,也可以定义多个,并且定义站点的时候,大括号前面的部分必须是 Site Address
,比如示例中的 localhost
,一个站点可以有一个站点地址,也可以有多个。
块
Block
,也就是大括号 {}
内的这部分。左大括号 {
必须在行的末尾,而右大括号 }
则必须自己单独占一行,这和我们Go语言编程很像,这样可以保持美观。
... {
...
}
我们前面讲过,只有一个站点的时候,大括号是可选的,但是当有多个站点的时候,必须得用大括号把他们分开。
example1.com {
root * /www/example.com
file_server
}
example2.com {
reverse_proxy localhost:9000
}
如果一个网络请求,匹配多个站点,那么Caddy只会选择地址最匹配的那个,不会同时匹配多个站点,这保障了站点匹配的唯一性,不会级联。
指令
指令只能属于某个站点,它是定义站点服务的关键字,位于一行中的第一个单词。比如我们示例中的 file_server
就是一个定义静态文件服务的指令。
指令也可以有子指令,子指令位于指令