🙈 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进行适配,能够实时更新全量配置