首页 > 系统相关 >caddyserver nginx adaper 简单说明

caddyserver nginx adaper 简单说明

时间:2023-01-23 11:35:40浏览次数:64  
标签:nil err warnings ss nginx caddyserver adaper dir

caddyserver 包含了一个强大的adapter 架构设计,我们可以方便的进行 caddyserver 扩展
nginx 扩展的处理核心也是基于adapter 模块扩展的,通过解析nginx.conf 文件,然后转换为json 格式内容

参考处理

 
func init() {
  // 注册Adapter
  caddyconfig.RegisterAdapter("nginx", Adapter{})
}
 
const ErrUnrecognized = "unrecognized or unsupported nginx directive"
const ErrNamedLocation = "named locations marked by @ are unnsupported"
const ErrExpiresAtTime = "usage of `expires @time` is not supported"
 
// Adapter adapts NGINX config to Caddy JSON.
type Adapter struct{}
// 解析nginx 配置并 转换为json 格式
// Adapt converts the NGINX config in body to Caddy JSON.
func (Adapter) Adapt(body []byte, options map[string]interface{}) ([]byte, []caddyconfig.Warning, error) {
  filename := "nginx.conf"
  if v, ok := options["filename"].(string); ok {
    filename = v
    filename, _ = filepath.Abs(filename)
  }
  // 解析nginx 的关键token
  tokens := tokenize(body, filename)
 // 解析nginx 指令
  dirs, err := parse(tokens)
  if err != nil {
    return nil, nil, fmt.Errorf("parsing: %v", err)
  }
 
  ss := setupState{
    servers: make(map[string]*caddyhttp.Server),
  }
 
  warnings, err := ss.mainContext(dirs)
  if err != nil {
    return nil, nil, err
  }
 
  httpApp := caddyhttp.App{
    Servers: ss.servers,
  }
 
  ss.mainConfig.AppsRaw = map[string]json.RawMessage{
    "http": caddyconfig.JSON(httpApp, &warnings),
  }
 
  result, err := json.Marshal(ss.mainConfig)
 
  return result, warnings, err
}

nginx 解析处理

parse.go 以及lexer.go 中处理上还是值得学习的,部分应该也参考了部分社区的golang nginx 解析工具
转换caddy 配置处理,实际解析都会处理为标准的caddy.Config

 
func (ss *setupState) mainContext(dirs []Directive) ([]caddyconfig.Warning, error) {
  var warnings []caddyconfig.Warning
  for _, dir := range dirs {
    var warns []caddyconfig.Warning
    var err error
    switch dir.Name() {
    case "http":
      warns, err = ss.httpContext(dir.Block)
    default:
      warns = []caddyconfig.Warning{
        {
          File:      dir.File,
          Line:      dir.Line,
          Directive: dir.Name(),
          Message:   ErrUnrecognized,
        },
      }
    }
    warnings = append(warnings, warns...)
    if err != nil {
      return warnings, err
    }
  }
  return warnings, nil
}
 
func (ss *setupState) httpContext(dirs []Directive) ([]caddyconfig.Warning, error) {
  var warnings []caddyconfig.Warning
  for _, dir := range dirs {
    var warns []caddyconfig.Warning
    var err error
    switch dir.Name() {
    case "index":
      for k, d := range dirs {
        if d.Name() == "server" {
          dirs[k].Block = append(d.Block, dir)
        }
      }
    case "server":
      warns, err = ss.serverContext(dir.Block)
    case "upstream":
      up, w, err := ss.upstreamContext(dir.Block)
      warns = append(warns, w...)
      if err != nil {
        return warns, err
      }
      if ss.upstreams == nil {
        ss.upstreams = make(map[string]Upstream)
      }
      ss.upstreams[dir.Param(1)] = up
    default:
      warns = []caddyconfig.Warning{
        {
          File:      dir.File,
          Line:      dir.Line,
          Directive: dir.Name(),
          Message:   ErrUnrecognized,
        },
      }
    }
    warnings = append(warnings, warns...)
    if err != nil {
      return warnings, err
    }
  }
  return warnings, nil
}

server 处理的 (server.go 中)会转换为标准caddy 配置的监听,路由等处理,详细的可以参考

说明

caddyserver nginx adaper 核心还是将nignx 配置转换为json 格式,之后caddy 会按照标准 adaper 模式进行加载,注意实际使用的时候需要自己构建
可以使用xcaddy 构建工具

参考资料

nginxadapter.go
https://github.com/caddyserver/nginx-adapter
https://caddyserver.com/docs/json/apps/http/
https://caddyserver.com/docs/config-adapters
https://caddyserver.com/docs/extending-caddy/config-adapters
https://caddyserver.com/docs/architecture
https://github.com/recoye/config
https://github.com/yangchenxing/go-nginx-conf-parser
https://www.nginx.com/resources/wiki/start/topics/examples/full/
https://github.com/caddyserver/xcaddy

标签:nil,err,warnings,ss,nginx,caddyserver,adaper,dir
From: https://www.cnblogs.com/rongfengliang/p/17065067.html

相关文章

  • 深入浅出学习透析Nginx服务器的架构分析及原理分析「底层技术原理+运作架构机制」
    Nginx再次回顾也许你已经忘记了Nginx是做什么的?我来再次给你夯实一下概念。多协议反向代理Nginx是个高性能的Web和反向代理服务器及HTTP服务器,它能反向代理HTTP,HTTPS和邮件......
  • 配置nginx的上游服务器,实现将发送给nginx 的请求转发给网关
    首先需要在nginx的nginx.conf的http模块配置上游服务器  再将nginx中的conf.d中的任意一个配置文件中配置server模块  如果网关是通过host的方式进行匹配,需要......
  • Nginx与LUA(6)
    您好,我是湘王,这是我的博客园。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!  如前所述,OpenResty是一个基于Ngin......
  • Nginx与LUA(6)
    您好,我是湘王,这是我的51CTO博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!如前所述,OpenResty是一个基于Nginx与Lua......
  • nginx安装
     什么是nginx?    Nginx (enginex)是一个高性能的HTTP和反向代理web服务器,Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BS......
  • docker部署nginx+宿主机部署keepalive实现高可用(离线方式安装)
    docker部署nginx+宿主机部署keepalive实现高可用(离线方式安装)一、准备两台虚拟机,离线安装docker1.下载docker的安装包我这里是19.03.9版本链接:https://pan.baidu.com......
  • nginx【reggie_take_out】
    停止服务配置环境变量配置文件详解......
  • Nginx配置将二级域名解析到Linux服务器指定端口
    最近几天用Python写了个接口后台服务,把它部在了服务器的300端口上。之后,我又要把一个二级域名解析到该服务器的300端口上,此时就要用到NGINX了。因为之前对NGINX的使用并不......
  • 狂神说笔记——Nginx快速入门28
    Nginx快速入门在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。随着用户越来越多了,并发量慢慢增大了,此时一台服务器满足不了需求了。于......
  • Nginx部署私有apt源
    1、安装nginx服务器sudoaptinstallnginx测试是否安装成功浏览器输入http:/127.0.0.1出现如下网页就是安装正确。ip就是自己电脑的ip2、修改nginx配置文件打开配......