OpenNJet:下一代云原生应用引擎,支持动态配置与高效管理,简化运维任务,提升应用灵活性与安全性。
OpenNJet应用引擎介绍:
应用引擎是面向互联网和云原生应用提供的运行时组态服务程序。具备环境感知、安全控制、加速优化等能力,一般呈现为Web服务、流媒体服务、代理(Proxy)、应用中间件、API网关、消息队列等产品形态。
应用引擎在云原生架构中,除了提供南北向通信网关的功能以外,因为提供了服务网格中东西向通信、透明流量劫持、熔断、遥测与故障注入等新功能特性,其地位和作用在云原生架构中变得愈发重要。
OpenNJet最早是基于NGINX1.19基础,fork并独立演进的开源应用引擎,并随着NGINX版本迭代,吸收上游NGINX的更新,已经同步更新到NGINX1.23.1版本。OpenNJet的目标在于适应国内特定的技术规范及标准,如国密算法套件支持,并构建安全可控的云原生数据面,支撑我国云原生产业生态。作为底层引擎,OpenNJet利用动态加载机制可以实现不同的产品形态,如API网关、消息代理、出入向代理,负载均衡,WAF等。
相比市面其他类型的API网关,高性能是NGINX主要的优点,但动态配置能力的缺乏一直受到业界的诟病。OpenNJet在NGINX的架构上进行了扩充,对其框架进行了改写,增加了 C 及可持久化的动态存储能力,解决了指令配置变更动态生效的关键问题,扩展了OpenNJet的应用场景。此外,业界对应用引擎可观测性的需求,需要应用引擎持续不断的采集性能指标、日志数据以及注入跟踪信息,但这对应用引擎的性能造成了不可忽视的影响,OpenNJet利用Copilot framwork隔离了业务处理及配置变更和指标采集,避免了遥测对性能的影响。作为云原生的应用引擎,OpenNJet需要支持业界流行的Ingress及Sidecar的api规范,基于动态配置+ Copilot framework架构,NJet可以通过不断更新独立的相关Copilot module,实现对响应标准规范的及时支持。
如何通过 OpenNJet 部署 WEB SERVER?
NJet官方提供centos,ubuntu,cloudOS等多个版本的2进制安装包,及软件源。其中支持的有:
OS | 架构 | 当前版本 | 下载链接 |
---|---|---|---|
Centos7.x | x86-64 | 3.0.0 | https://gitee.com/njet-rd/njet/releases/download/v3.0.0/njet-3.0.0-1.el7.x86_64.rpm |
Ubuntu18. 04 | x86-64 | 3.0.0 | https://gitee.com/njet-rd/njet/releases/download/v3.0.0/njet_3.0.0-1ubuntu.18.04bionic_amd64.deb |
Ubuntu20.04 | x86-64 | 3.0.0 | https://gitee.com/njet-rd/njet/releases/download/v3.0.0/njet_3.0.0-1ubuntu.18.04bionic_amd64.deb |
Ubuntu22.04 | x86-64 | 3.0.0 | https://gitee.com/njet-rd/njet/releases/download/v3.0.0/njet_3.0.0-1ubuntu.18.04bionic_amd64.deb |
OpenCloud9 | x86-64 | 1.2.3 | https://gitee.com/njet-rd/njet/releases/download/v1.2.3/opennjet-1.2.3-1.ocs9.0.x86_64.rpm |
TencentOS Server 2 | x86-64 | 1.2.3 | https://gitee.com/njet-rd/njet/releases/download/v1.2.3/opennjet-1.2.3-1.tl2.x86_64.rpm |
TencentOS Server 2 | x86-64 | 1.2.3 | https://gitee.com/njet-rd/njet/releases/download/v1.2.3/opennjet-1.2.3-1.tl3.x86_64.rpm |
二进制安装:
OpenNJet 提供多个版本操作系统下的二进制安装文件,二进制包安装后,所有OpenNJet 相关的文件 都在 /usr/local/njet 目录下, 并在 /usr/lib/systemd/system 目录下添加service 文件。
不过,这里也发现安装完成后,不能像Nginx一样自动就启动,如果能自动启动就给力了,我们这里需要手动自己来启动一下。
【动态黑白名单配置】:
依赖模块,控制面参见上文控制面配置说明,数据面需要加载如下模块:
njt_helper_broker_module
njt_http_dyn_bwlist_module.so
配置指令:
动态配置无特殊的指令, 动态黑白名单的配置指令及格式与静态配置一致,使用 allow, deny 指定允许或拒绝的IP地址。
语法: allow address | CIDR | all;
默认值: --
允许配置位置: http, server, location
语法: deny address | CIDR | all;
默认值: --
允许配置位置: http, server, location
以下为静态配置文件的示例:
worker_processes 1;
error_log logs/error.log info;
load_module modules/njt_http_dyn_bwlist_module.so;
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper broker modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
events {
worker_connections 1024;
}
upstream backend {
server 10.10.12.1:8080;
}
http{
dyn_kv_conf conf/iot.conf;
server {
listen 18888;
location / {
proxy_pass http://${backend};
}
location /test_bwlist {
allow 192.168.1.0/24;
deny all;
proxy_pass http://${backend};
}
}
}
cluster_name helper;
node_name node1;
但是,OpenNJet提供了一种更好玩的形式,可以使用GET方法获取当前各location 的黑白名单配置,使用PUT方法更新黑白名单配置。PUT 提交时报文格式与GET获取到的报文格式一致,可以只提交需要改动的 location。
curl -X 'PUT' \
'http://116.62.101.2:8081/api/v1/config/http_dyn_bwlist' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"servers": [{
"listens": ["0.0.0.0:8080"],
"serverNames": [""],
"locations": [
{
"location": "/",
"accessIpv4": [{
"rule": "allow",
"addr": "172.16.94.0",
"mask": "255.255.255.0"
}, {
"rule": "deny",
"addr": "0.0.0.0",
"mask": "0.0.0.0"
}]
}]
}]
}'
我们可以先进行内网IP和本机IP的测试,使用curl来进行发送请求,可以看到都是可以请求成功了。
接下来,我们使用curl发送一个PUT的请求,来动态请求OpenNJet服务器的接口,这里先是让172.16.94.0这个区间段来允许可以访问,然后,本机0.0.0.0是拒绝的,请求返回{“code”:0,“msg”:“success.”}表示设置成功了。
不需要任何重启,不需要任何修改配置文件
最后,可以使用GET方法获取当前黑白名单静态配置信息。
curl -X 'GET' \
'http://116.62.101.2:8081/api/v1/config/http_dyn_bwlist' \
-H 'accept: application/json'
动态配置无特殊的指令, 动态黑白名单的配置指令及格式与静态配置一致,使用 allow, deny 指定允许或拒绝的IP地址。