和Nginx不一样的是,Caddy还可以使用API来管理,通过这个能力,你可以在CI、CD的时候,对caddy做更多的事情,也更灵活。

查看配置

首先,我们启动一个caddy实例,然后通过caddy提供的/configAPI查看它的配置。

1
➜ caddy run

启动后,caddy 的管理API会在2019端口监听,现在,我们通过访问/configAPI,看下它的配置是什么。

1
2
➜  ~ curl localhost:2019/config/
null

从以上返回结果看,并没有任何配置,也就是没有任何配置的网络服务。 现在,我们通过API接口来配置一个。

配置Hello World

要实现访问localhost就可以看到Hello World,我们需要对caddy进行配置。前面的教程中,我们是通过命令行或者Caddyfile配置的,这一次呢,我们通过load这个API来配置caddy。

首先,我们还是要准备一个Caddyfile,它的内容如下所示:

1
2
3
localhost {
  respond "Hello, world!"
}

然后,我们使用curl这个工具,通过caddy的loadAPI 上传Caddyfile 配置caddy。

1
2
3
➜ curl -X POST "http://localhost:2019/load" \
-H "Content-Type: text/caddyfile" \
--data-binary @Caddyfile

这里需要注意的是,执行以上命令的目录下一定要有Caddyfile,因为我使用的是@Caddyfile,是一个相对路径,如果不是,请换成Caddyfile的绝对路径。 现在,再通过curl localhost:2019/config/访问,就可以看到caddy的配置了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
➜ curl localhost:2019/config/ |jq 
{
  "apps": {
    "http": {
      "servers": {
        "srv0": {
          "listen": [
            ":443"
          ],
          "routes": [
            {
              "handle": [
                {
                  "handler": "subroute",
                  "routes": [
                    {
                      "handle": [
                        {
                          "body": "Hello, world!",
                          "handler": "static_response"
                        }
                      ]
                    }
                  ]
                }
              ],
              "match": [
                {
                  "host": [
                    "localhost"
                  ]
                }
              ],
              "terminal": true
            }
          ]
        }
      }
    }
  }
}

看到了吧,这就是我们刚刚通过loadAPI 达到的重新配置的caddy,以上就是caddy最原始的JSON配置。

jq 是一个JSON工具,如果你的电脑没有的话,可以Google搜索下安装,这里主要用来美化下输出的JSON

/loadAPI就是一个可以重新设置、替换caddy的admin API,支持JSON文件和Caddyfile。

现在,在浏览器,或者通过curl 访问localhost,就可以看到Hello World了。

1
2
➜ curl https://localhost/
Hello, world!

更新部分配置

加入,现在我想把Hello World换成你好,世界,总不能再上传一个Caddyfile覆盖吧?

哈哈,当然不会,caddy 的Admin API提供了可以修改某一部分配置的能力。在caddy中,是可以支持通过URL 路径来指定要访问哪个配置节点的。

注意看我们上面列出的JSON的配置,按JSON节点找,看看Hello World在哪里。看下是不是这个?apps/http/servers/srv0/routes/0/handle/0/routes/0/handle/0/body,遇到JSON数组,要使用索引作为path,表示第几个元素。

现在把它和/config/拼接起来就是http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0/routes/0/handle/0/body这样的一个URL。

可以访问下它,看看输出什么。

1
2
➜ curl http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0/routes/0/handle/0/body
"Hello, world!"

成功访问,输出的正好是我们想修改的内容。

现在,通过POST的方法, 把它修改为:你好,世界。

1
2
3
4
➜ curl http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0/routes/0/handle/0/body     
-X POST \
-H "Content-Type: application/json" \
-d '"你好,世界!"'

以上命令回车后,现在你再用浏览器打开https://localhost/,就可以看到:你好,世界!了。

这种可以更新部分配置的方法非常实用,因为它风险小,可以结合编程自动化。

进一步简化配置

上面通过URL PATH遍历配置的方式很方便,可以让我们定位到配置,并且只修改需要修改的配置,但是就是URL太长了,这一小节就带你使用@id标记来简化它。

要想简化某项配置,首先我们得先给它添加一个标记,比如给上一节中我们要处理的handle添加一个快捷访问的标记msg

1
2
3
4
➜ curl http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0/routes/0/handle/0/@id 
-X POST \
-H "Content-Type: application/json" \
-d '"msg"' 

以上命令执行后,在浏览器里打开http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0/routes/0/handle/0/,你将看到如下结果:

1
{"@id":"msg","body":"你好,世界!","handler":"static_response"}

现在,我们就可以通过这个@id标记快捷的访问它了,在浏览器中输入http://localhost:2019/id/msg,你会看到和上面的URL一样的输出结果。

所以,通过id标记,不管你是获取配置还是修改配置,URL都会非常简洁,也便于输入。

小节

这一篇文章主要介绍了如何通过Admin API来管理caddy,使用上也非常简单,结合编码,可以很容易的实现自动化配置。

这里我主要介绍了/load,/configAPI,以及@id标记,还有/stop/reverse_proxy/upstreamsAPI没有介绍,但是使用方法都是大同小异的,并且符合Restful 规范,所以这里就不再介绍了,可以通过查看官方https://caddyserver.com/docs/api了解这些API的详细使用。

本文为原创文章,转载注明出处,欢迎扫码关注公众号flysnow_org或者网站asf http://www.flysnow.org/ ,第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「好看」,感谢支持。

扫码关注