NJet支持使用json格式的配置文件了

🙈 By 单雷 2025-07-14

简介

目前NJet的配置文件与Nginx的配置文件格式相同。这种配置文件的格式对我们阅读比较友好。但是对一些自动化配置的需求来说,处理起来就很困难。为了以后能够对NJet的配置通过自动化工具来进行维护,NJet增加了对json格式配置文件的支持。目前这种支持是很基本的,只是支持主配置文件为json格式,里面include的文件的格式还是与之前相同。

json格式

目前NJet支持的json文件的配置格式如下,参考了开源项目https://github.com/nginxinc/crossplane中的格式,并做了一些修改。

最外层

parsed的内容是一个数组,数组的每一项都是一个对象,这个对象对应着一条NJet命令,或者对应着一个NJet的block。

{
    "parsed":[ 
    {}
    ...
    {} //每一个obj对应一条cmd或一个block
    ],
    "file": "/usr/local/njet/njet.conf" // 这是对应原有格式的配置文件,类似于description
}

一条指令

一条指令中包含两个键值,cmd为一个字条串,对应的指令的名称,args是一个数组,对应指令中的具体参数。

      {
            "cmd": "error_log",
            "args": [
                "logs/error.log",
                "debug"
            ]
        },
        如果args为空,表明不需要参数

一个block

一个block中,有三个键值,其中cmd和args的含义与上面的指令是相同的,增加的block键值对应的是一个数组,数组的每一项又对应着一条指令或一个block。

    {
      "cmd": "events",
      "args": [],
      "block": [ //里面又是 obj 数组,可以是cmd 或 block
        {
          "cmd": "worker_connections",
          "args": [
            "102400"
          ]
        }
      ]
    },

block格式中有一些例外,就是 xxx_by_lua_block,这些block的格式与上面的通用格式不同,其block对应的数组中只有一个obj, obj的格式为{“code": “lua_code”}。

{
  "cmd": "access_by_lua_block",
  "args": [],
  "block": [
      {
           "code": "\n              local ac=require(\"api_gateway.access.control\")\n              local access=ac.new(\"/api_gateway\")\n              access:check()\n           "
      }
  ]
},

实例

下面是一个server的配置

 server  {     
       listen 8443 ssl;
       ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
       ssl_ciphers         AES128-SHA; 
      
       ssl_certificate     certs/rsa.cer;
       ssl_certificate_key certs/rsa.pem; 
       
       location / { 
           return 200 "8443 ok";     
       } 
                                     
       location /api_gateway {         
           access_by_lua_block {
              local ac=require("api_gateway.access.control")     
              local access=ac.new("/api_gateway")
              access:check()   
           }
                      
           content_by_lua_block {     
              local api_gateway=require("api_gateway") 
              api_gateway.main() 
           } 
      }
  }

对应的json配置

{
    "cmd": "server",
    "args": [

    ],
    "block": [
        {
            "cmd": "listen",
            "args": [
                "8443",
                "ssl"
            ]
        },
        {
            "cmd": "ssl_protocols",
            "args": [
                "TLSv1",
                "TLSv1.1",
                "TLSv1.2",
                "TLSv1.3"
            ]
        },
        {
            "cmd": "ssl_ciphers",
            "args": [
                "AES128-SHA"
            ]
        },
        {
            "cmd": "ssl_certificate",
            "args": [
                "certs/rsa.cer"
            ]
        },
        {
            "cmd": "ssl_certificate_key",
            "args": [
                "certs/rsa.pem"
            ]
        },
        {
            "cmd": "location",
            "args": [
                "/"
            ],
            "block": [
                {
                    "cmd": "return",
                    "args": [
                        "200",
                        "8443 ok"
                    ]
                }
            ]
        },
        {
            "cmd": "location",
            "args": [
                "/api_gateway"
            ],
            "block": [
                {
                    "cmd": "access_by_lua_block",
                    "args": [

                    ],
                    "block": [
                        {
                            "code": "\n              local ac=require(\"api_gateway.access.control\")\n              local access=ac.new(\"/api_gateway\")\n              access:check()\n           "
                        }
                    ]
                },
                {
                    "cmd": "content_by_lua_block",
                    "args": [

                    ],
                    "block": [
                        {
                            "code": "\n              local api_gateway=require(\"api_gateway\")\n              api_gateway.main()\n           "
                        }
                    ]
                }
            ]
        }
    ]
}

使用

NJet从3.3版本开始支持json格式的配置文件,json配置文件的使用与之前NJet的启动方式相同,在解析时,NJet会先检查配置文件是否为json格式,并依据文件格式来执行相应的解析操作

./sbin/njet   -p . -c conf/njet_conf.json 

后续开发内容

  • 可以支持json与njet现有配置文件之间的互相include,或者增加一个指令include_json。
  • 支持对指定位置配置的查找,更新等。
  • 对现在的动态配置API进行适配,能够实时更新全量配置