<span id="OSC_h3_1"></span>
简介
目前NJet的配置文件与Nginx的配置文件格式相同。这种配置文件的格式对我们阅读比较友好。但是对一些自动化配置的需求来说,处理起来就很困难。为了以后能够对NJet的配置通过自动化工具来进行维护,NJet增加了对json格式配置文件的支持。目前这种支持是很基本的,只是支持主配置文件为json格式,里面include的文件的格式还是与之前相同。
json格式
目前NJet支持的json文件的配置格式如下,参考了开源项目https://github.com/nginxinc/crossplane中的格式,并做了一些修改。
最外层
parsed的内容是一个数组,数组的每一项都是一个对象,这个对象对应着一条NJet命令,或者对应着一个NJet的block。
{
<span style="color:#f92672">"parsed"</span>:[
{}<span style="background-color:#1e0010; color:#960050">,</span>
<span style="background-color:#1e0010; color:#960050">...</span>
{} <span style="color:#75715e">//每一个obj对应一条cmd或一个block
</span> ],
<span style="color:#f92672">"file"</span>: <span style="color:#e6db74">"/usr/local/njet/njet.conf"</span> <span style="color:#75715e">// 这是对应原有格式的配置文件,类似于description
</span>}
一条指令
一条指令中包含两个键值,cmd为一个字条串,对应的指令的名称,args是一个数组,对应指令中的具体参数。
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"error_log"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"logs/error.log"</span>,
<span style="color:#e6db74">"debug"</span>
]
}<span style="background-color:#1e0010; color:#960050">,</span>
<span style="background-color:#1e0010; color:#960050">如果args为空,表明不需要参数</span>
一个block
一个block中,有三个键值,其中cmd和args的含义与上面的指令是相同的,增加的block键值对应的是一个数组,数组的每一项又对应着一条指令或一个block。
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"events"</span>,
<span style="color:#f92672">"args"</span>: [],
<span style="color:#f92672">"block"</span>: [ <span style="color:#75715e">//里面又是 obj 数组,可以是cmd 或 block
</span> {
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"worker_connections"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"102400"</span>
]
}
]
}<span style="background-color:#1e0010; color:#960050">,</span>
block格式中有一些例外,就是 xxx_by_lua_block,这些block的格式与上面的通用格式不同,其block对应的数组中只有一个obj, obj的格式为{“code”: “lua_code”}。
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"access_by_lua_block"</span>,
<span style="color:#f92672">"args"</span>: [],
<span style="color:#f92672">"block"</span>: [
{
<span style="color:#f92672">"code"</span>: <span style="color:#e6db74">"\n local ac=require(\"api_gateway.access.control\")\n local access=ac.new(\"/api_gateway\")\n access:check()\n "</span>
}
]
}<span style="background-color:#1e0010; color:#960050">,</span>
实例
下面是一个server的配置
server <span style="color:#f92672">{</span>
listen <span style="color:#ae81ff">8443</span> 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 / <span style="color:#f92672">{</span>
<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">200</span> <span style="color:#e6db74">"8443 ok"</span>;
<span style="color:#f92672">}</span>
location /api_gateway <span style="color:#f92672">{</span>
access_by_lua_block <span style="color:#f92672">{</span>
local ac<span style="color:#f92672">=</span>require<span style="color:#f92672">(</span>
<span style="color:#e6db74">"api_gateway.access.control"</span>
<span style="color:#f92672">)</span>
local access<span style="color:#f92672">=</span>ac.new<span style="color:#f92672">(</span>
<span style="color:#e6db74">"/api_gateway"</span>
<span style="color:#f92672">)</span>
access:check<span style="color:#f92672">()</span>
<span style="color:#f92672">}</span>
content_by_lua_block <span style="color:#f92672">{</span>
local api_gateway<span style="color:#f92672">=</span>require<span style="color:#f92672">(</span>
<span style="color:#e6db74">"api_gateway"</span>
<span style="color:#f92672">)</span>
api_gateway.main<span style="color:#f92672">()</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
对应的json配置
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"server"</span>,
<span style="color:#f92672">"args"</span>: [
],
<span style="color:#f92672">"block"</span>: [
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"listen"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"8443"</span>,
<span style="color:#e6db74">"ssl"</span>
]
},
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_protocols"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"TLSv1"</span>,
<span style="color:#e6db74">"TLSv1.1"</span>,
<span style="color:#e6db74">"TLSv1.2"</span>,
<span style="color:#e6db74">"TLSv1.3"</span>
]
},
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_ciphers"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"AES128-SHA"</span>
]
},
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_certificate"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"certs/rsa.cer"</span>
]
},
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_certificate_key"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"certs/rsa.pem"</span>
]
},
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"location"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"/"</span>
],
<span style="color:#f92672">"block"</span>: [
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"return"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"200"</span>,
<span style="color:#e6db74">"8443 ok"</span>
]
}
]
},
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"location"</span>,
<span style="color:#f92672">"args"</span>: [
<span style="color:#e6db74">"/api_gateway"</span>
],
<span style="color:#f92672">"block"</span>: [
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"access_by_lua_block"</span>,
<span style="color:#f92672">"args"</span>: [
],
<span style="color:#f92672">"block"</span>: [
{
<span style="color:#f92672">"code"</span>: <span style="color:#e6db74">"\n local ac=require(\"api_gateway.access.control\")\n local access=ac.new(\"/api_gateway\")\n access:check()\n "</span>
}
]
},
{
<span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"content_by_lua_block"</span>,
<span style="color:#f92672">"args"</span>: [
],
<span style="color:#f92672">"block"</span>: [
{
<span style="color:#f92672">"code"</span>: <span style="color:#e6db74">"\n local api_gateway=require(\"api_gateway\")\n api_gateway.main()\n "</span>
}
]
}
]
}
]
}
使用
NJet从3.3版本开始支持json格式的配置文件,json配置文件的使用与之前NJet的启动方式相同,在解析时,NJet会先检查配置文件是否为json格式,并依据文件格式来执行相应的解析操作
<span style="background-color:#1e0010; color:#960050">./sbin/njet</span> <span style="background-color:#1e0010; color:#960050">-p</span> <span style="background-color:#1e0010; color:#960050">.</span> <span style="background-color:#1e0010; color:#960050">-c</span> <span style="background-color:#1e0010; color:#960050">conf/njet_conf.json</span>
后续开发内容
- 可以支持json与njet现有配置文件之间的互相include,或者增加一个指令include_json。
- 支持对指定位置配置的查找,更新等。
- 对现在的动态配置API进行适配,能够实时更新全量配置
</div>
未经允许不得转载:紫竹林-程序员中文网 » NJet支持使用json格式的配置文件了