date: 2018-12-07 23:42:14 +0800 title: “在Go程序中中嵌入Caddy” sitename: “Caddy开发者wiki”

template: “wiki”

在Go程序中中嵌入Caddy

英文原文:https://github.com/mholt/caddy/wiki/Extending-Caddy


加入Caddy交流论坛和其他开发者一起分享。

你可以用Caddy作为你Go应用程序的库。如果你的Go应用程序需要的不仅仅是Go的基本静态文件服务器或反向代理,那么这一点非常有用。当你需要重新加载程序时,你甚至可以利用Caddy优雅的重启功能。

如果你只需要caddy包,链接的godoc有相关指令。

注意:如果你不想创建原始的Caddyfile字符串,可以使用Caddyfile包将字符串转化为通过JSON表示的标识。它结构简单,很容易使用代码操作,而不需要解析原始字符串。

下面是一个简单的例子:

  1. caddy.AppName = "Sprocket"
  2. caddy.AppVersion = "1.2.3"
  3. // 传入这个Caddyfile的服务类型名称(比如"http")
  4. caddyfile, err := caddy.LoadCaddyfile(serverType)
  5. if err != nil {
  6. log.Fatal(err)
  7. }
  8. instance, err := caddy.Start(caddyfile)
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. // Start() 在服务启动完毕前处于阻塞状态
  13. // Wait() 在服务停止前处于阻塞状态
  14. instance.Wait()

你也能重启Caddy:

  1. // 在Linux系统,能使用平滑重启
  2. // 要使用同一个Caddyfile,只需要传入nil
  3. // 请务必使用新实例替换掉旧的!
  4. instance, err = instance.Restart(newCaddyfile)
  5. if err != nil {
  6. log.Fatal(err)
  7. }

或者停止它:

  1. err = instance.Stop()
  2. if err != nil {
  3. log.Fatal(err)
  4. }

下面是另外一个例子,用来为你的应用从当前目录载入Caddyfile:

  1. package main
  2. import (
  3. "io/ioutil"
  4. "log"
  5. "os"
  6. "github.com/mholt/caddy"
  7. _ "github.com/mholt/caddy/caddyhttp"
  8. )
  9. func init() {
  10. // 配置默认caddyfile
  11. caddy.SetDefaultCaddyfileLoader("default", caddy.LoaderFunc(defaultLoader))
  12. }
  13. func main() {
  14. caddy.AppName = "Sprocketplus"
  15. caddy.AppVersion = "1.2.3"
  16. // 载入caddyfile
  17. caddyfile, err := caddy.LoadCaddyfile("http")
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. // 启动caddy服务
  22. instance, err := caddy.Start(caddyfile)
  23. if err != nil {
  24. log.Fatal(err)
  25. }
  26. instance.Wait()
  27. }
  28. // 提供载入功能
  29. func defaultLoader(serverType string) (caddy.Input, error) {
  30. contents, err := ioutil.ReadFile(caddy.DefaultConfigFile)
  31. if err != nil {
  32. if os.IsNotExist(err) {
  33. return nil, nil
  34. }
  35. return nil, err
  36. }
  37. return caddy.CaddyfileInput{
  38. Contents: contents,
  39. Filepath: caddy.DefaultConfigFile,
  40. ServerTypeName: serverType,
  41. }, nil
  42. }

请务必参考godoc获取caddy包的最新内容。好运!