对Caddy有了初步认知之后,我们知道Caddy常见的使用方案是JSON+API或Caddyfile+CLI。本文将进一步介绍,如何使用JSON搭配Caddy API管理Caddy服务的相关内容。
1.Caddy API简介
通过HTTP形式访问Caddy的管理终端,我们可以对Caddy的配置进行各种操作,Caddy默认的管理终端地址是:localhost:2019。
值得一提的是,Caddy配置具有持久性。比如,对Caddy配置每一次的有效更改,都会被保存到磁盘上。当因为某种原因导致Caddy服务宕机,你可以通过–resume选项(caddy run –resume)重启Caddy服务,并使得Caddy配置恢复到服务宕机前最新的配置状态。
Caddy常用API介绍如下
(1)POST /load
作用:设置或覆盖当前配置,阻塞调用。
对配置的更改是轻量级且高效的,并不会导致Caddy服务宕机,如果配置更新失败,Caddy服务会将配置回滚到上一次的配置状态。
示例:
1 2 3 |
$ curl -X POST "http://localhost:2019/load" \ -H "Content-Type: application/json" \ -d @caddy.json |
其中,
-H 选项中的Content-Type头,指明了请求正文中使用的配置格式为json。如果你的配置文件为其它Caddy支持的格式,需要在此指明;
-d,指定了配置文件数据,且-d会移除文件中的换行符。如果需要保留换行符,请用–data-binary替代。比如:
1 2 3 |
$ curl -X POST "http://localhost:2019/load" \ -H "Content-Type: text/caddyfile" \ --data-binary @Caddyfile |
(2)POST /stop
作用:关闭Caddy服务并安全退出。如果只停止配置而不退出Caddy服务,使用DELETE /config/
示例:
1 |
$ curl -X POST "http://localhost:2019/stop" |
(3)GET /config/[path]
作用:将指定路径上的Caddy配置输出,返回格式为JSON。
示例1,输出完整的配置:
1 2 |
$ curl "http://localhost:2019/config/" {"apps":{"http":{"servers":{"example":{"listen":[":2015"],"routes":[{"handle":[{"body":"Hello, world!","handler":"static_response"}]}]}}}}} |
示例2,输出监听地址:
1 2 |
$ curl "http://localhost:2019/config/apps/http/servers/example/listen" [":2015"] |
(4)POST /config/[path]
作用:修改path指定路径上的配置,为请求体中的JSON数据。
如果目标路径指向的是一个JSON数组,此API的作用是将请求体中的JSON配置项追加到数组中,此外,若path路径以/…结尾,表明/…前的元素为数组,也可以将一个或多个请求中的JSON配置项追加到此数组中;(类似于go语言中slice对象的append方法)
如果目标路径指向的是一个JSON对象,次API的作用是设置或更新这个对象;
示例1,追加一个地址:
1 2 3 4 5 6 7 |
$ curl -X POST \ -H "Content-Type: application/json" \ -d '":8080"' \ "http://localhost:2019/config/apps/http/servers/example/listen" $ curl "http://localhost:2019/config/apps/http/servers/example/listen" [":2015",":8080"] |
示例2,追加多个地址:
1 2 3 4 5 6 7 |
$ curl -X POST \ -H "Content-Type: application/json" \ -d '[":9090", ":7070"]' \ "http://localhost:2019/config/apps/http/servers/example/listen/..." $ curl "http://localhost:2019/config/apps/http/servers/example/listen" [":2015",":8080",":9090",":7070"] |
(5)PUT /config/[path]
作用:在path指定路径上新增一个配置,配置为请求体中的JSON数据。类似于POST /config/[path],不同点在于PUT要求path指定的对象是不存在的,因为PUT旨在新建一个值。(见示例2)
如果目标路径指向的是数组中的一个索引位置,则将请求体中的JSON配置插入此位置;
如果目标路径指向的是一个对象,则使用请求体中的JSON配置创建一个新值;
示例1,在listen[0]插入一个地址:
1 2 3 4 5 6 7 |
$ curl -X PUT \ -H "Content-Type: application/json" \ -d '":2014"' \ "http://localhost:2019/config/apps/http/servers/example/listen/0" $ curl "http://localhost:2019/config/apps/http/servers/example/listen" [":2014",":2015",":8080",":9090",":7070"] |
示例2,修改body对象:(错误的示例)
1 2 3 4 5 |
$ curl -X PUT \ -H "Content-Type: application/json" \ -d '"Hello Caddy!"' \ "http://localhost:2019/config/apps/http/servers/example/routes/0/handle/0/body" {"error":"[/config/apps/http/servers/example/routes/0/handle/0/body] key already exists: body"} # 报错,body已经存在 |
报错,修改body对象的值失败,可见PUT API要求path指定的元素必须是不存在的。
思考,如果我们确实想要修改这个body对象而不是新建一个body对象,应该怎么做呢?
使用POST方法,如下所示:
1 2 3 4 5 6 7 |
$ curl -X POST\ -H "Content-Type: application/json" \ -d '"Hello Caddy!"' \ "http://localhost:2019/config/apps/http/servers/example/routes/0/handle/0/body" $ curl "http://localhost:2019/config/apps/http/servers/example/routes/0/handle/0/body" "Hello Caddy!" |
(6)PATCH /config/[path]
作用:替换path指定路径的对象,替换为请求中的JSON数据。
示例:替换监听地址
1 2 3 4 5 6 7 |
$ curl -X PATCH \ -H "Content-Type: application/json" \ -d '[":8081", ":8082"]' \ "http://localhost:2019/config/apps/http/servers/example/listen" $ curl "http://localhost:2019/config/apps/http/servers/example/listen" [":8081",":8082"] |
(7)Delete /config/[path]
作用:删除path指定路径上的对象。
示例1,删除服务example:
1 2 3 4 |
$ curl -X DELETE "http://localhost:2019/config/apps/http/servers/example" $ curl "http://localhost:2019/config/" {"apps":{"http":{"servers":{}}}} |
示例2,卸载整个配置:
1 2 3 4 |
$ curl -X DELETE "http://localhost:2019/config/" $ curl "http://localhost:2019/config/" null |
2.使用@id
通过上面Caddy API的介绍,我们发现如果需要修改JSON配置中的某一个对象,首先需要通过path来指定待修改对象。如果这个对象的修改很频繁,就显得有些繁琐。所以,Caddy提供了@id特性,将某一个对象用@id标示,之后的修改可以直接通过@id来操作。
比如,将某一个反向代理的配置做如下@id标示:
1 2 3 4 5 6 7 8 9 |
{ "@id": "my_proxy", "handler": "reverse_proxy" "upstreams": [ { "dial": "10.15.112.151:6868" } ] } |
当修改upstreams时,path可以这样指定为:
1 2 3 4 |
/id/my_proxy/upstreams #不使用@id /config/apps/http/servers/myserver/routes/0/handle/0/upstreams |
参考:
[1] https://caddyserver.com/docs/api