Caddy 實戰(四)- 使用 API 管理 Caddy

和 Nginx 不一樣的是,Caddy 還可以使用 API 來管理,通過這個能力,你可以在 CI、CD 的時候,對 caddy 做更多的事情,也更靈活。

查看配置

首先,我們啓動一個 caddy 實例,然後通過 caddy 提供的/configAPI 查看它的配置。

➜ caddy run

啓動後,caddy 的管理 API 會在 2019 端口監聽,現在,我們通過訪問/configAPI,看下它的配置是什麼。

➜  ~ curl localhost:2019/config/
null

從以上返回結果看,並沒有任何配置,也就是沒有任何配置的網絡服務。
現在,我們通過 API 接口來配置一個。

配置 Hello World

要實現訪問localhost就可以看到 Hello World,我們需要對 caddy 進行配置。前面的教程中,我們是通過命令行或者 Caddyfile 配置的,這一次呢,我們通過load這個 API 來配置 caddy。

首先,我們還是要準備一個 Caddyfile,它的內容如下所示:

localhost {
  respond "Hello, world!"
}

然後,我們使用curl這個工具,通過 caddy 的loadAPI 上傳 Caddyfile 配置 caddy。

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

這裏需要注意的是,執行以上命令的目錄下一定要有 Caddyfile,因爲我使用的是@Caddyfile,是一個相對路徑,如果不是,請換成 Caddyfile 的絕對路徑。
現在,再通過curl localhost:2019/config/訪問,就可以看到 caddy 的配置了。

➜ 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 了。

➜ 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。

可以訪問下它,看看輸出什麼。

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

成功訪問,輸出的正好是我們想修改的內容。

現在,通過 POST 的方法, 把它修改爲:你好,世界。

➜ 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

➜ 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/,你將看到如下結果:

{"@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或者網站 https://www.flysnow.org/,第一時間看後續精彩文章。覺得好的話,請猛擊文章右下角「在看」,感謝支持。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/K54z4mKCjsFfrdWHM0KQTg