OpenNJet
OpenNJet 应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面,NJet具备动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。通过CoPliot副驾驶服务框架,在隔离控制面和数据面的情况下实现了高可扩展性。NJet应用引擎助力企业实现云原生技术的平滑升级并大幅降低IT运营成本。
OpenNJet 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目!
独特优势
✨高性能:NJet性能是CNCF推荐Envoy的三倍。
✨功能多:内置HTTP3、故障注入、遥测、配置动态加载、服务发现等功能
✨强安全:集成Web应用防火墙、原生支持国密/ RSA加密解密算法
✨可扩展:强大的插件框架能力支持第三方应用开发
✨可编程:支持LUA、Python可编程控制脚本
✨易管理:提供完善的API接口,内置多主集群和高可用性能力
快速开始
我们提供了几种快速使用的方法:
- 二进制安装
- 发行版安装
- 源码安装
- docker镜像启动
镜像构建
如果大家想制作OpenNJet镜像,可使用如下方法:
下载njet_main源码,执行如下命令:
cd njet_main
//导入环境变量
export NJET_RIEPOSITORY="tmlake/njet"
export NJET_TAG="latest"
//构建镜像
docker build --build-arg NJet_VERSION=$NJET_TAG --build-arg GIT_COMMIT=$(git rev-parse HEAD) --network host --target ubuntu-njet -f ./build/docker/Dockerfile_njet -t $NJET_RIEPOSITORY:$NJET_TAG ./
通过 Swagger 的进行动态配置:
通过 swagger 的 url,http://njetaddr:8081/doc/swagger/ 进入 swagger 页面,可以看到会提供一个可视化的操作界面,里面包括很多动态的设置选项,这里我们以动态access log配置接口为主来进行操作。
1. 查看当前允许的动态模块:
使用一个GET请求,来进行查询本机支持哪些动态模块的修改,可以看到查出了4种。
curl -X 'GET' \
'http://121.41.236.243:8081/api/v1/config/' \
-H 'accept: application/json'
2. 查看当前服务http_log日志动态设置参数:
通过一个Get请求可以查看当前服务http_log日志动态设置参数,可以看到本机是有一条location为根目录的/,但是没有做任何的设置,这里我们可以来进行设置。
curl -X 'GET' \
'http://121.41.236.243:8081/api/v1/config/http_log' \
-H 'accept: application/json'
为了对比效果,我们再添加2个访问路径来演示操作情况:
以下是配置文件中增加2条访问路由,分别为njetTest1和njetTest2。
完整的conf配置文件:
worker_processes auto;
cluster_name njet;
node_name node1;
error_log logs/error.log error;
helper ctrl /usr/local/njet/modules/njt_helper_ctrl_module.so /usr/local/njet/conf/njet_ctrl.conf;
helper broker /usr/local/njet/modules/njt_helper_broker_module.so;
load_module /usr/local/njet/modules/njt_http_split_clients_2_module.so;
load_module /usr/local/njet/modules/njt_agent_dynlog_module.so;
load_module /usr/local/njet/modules/njt_http_dyn_bwlist_module.so;
load_module /usr/local/njet/modules/njt_dyn_ssl_module.so;
load_module /usr/local/njet/modules/njt_http_vtsc_module.so;
load_module /usr/local/njet/modules/njt_http_location_module.so;
#load_module /usr/local/njet/modules/njt_http_lua_module.so;
#load_module /usr/local/njet/modules/njt_http_modsecurity_module.so;
#load_module /usr/local/njet/modules/njt_http_dyn_modsecurity_module.so;
events {
worker_connections 1024;
}
http {
include mime.types;
access_log off;
vhost_traffic_status_zone;
#lua_package_path "$prefix/lualib/lib/?.lua;/usr/local/njet/modules/?.lua;$prefix/apps/?.lua;;";
#lua_package_cpath "$prefix/lualib/clib/?.so;;";
server {
#modsecurity on;
#modsecurity_rules_file /usr/local/njet/conf/modsec/main.conf;
listen 8080;
location / {
root html;
}
location /njetTest1 {
return 200 Test1ok\r\n;
}
location /njetTest2 {
return 200 Test2ok\r\n;
}
}
}
3. 动态请求设置http_log日志信息:
我们通过一个PUT请求来将2条路径分别设置一个是写入日志,另一个暂时先不写入日志。
curl -X 'PUT' \
'http://121.41.236.243:8081/api/v1/config/http_log' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"servers": [
{
"listens": [
"0.0.0.0:8080"
],
"serverNames": [
""
],
"locations": [
{
"location": "/njetTest1",
"accessLogOn": true,
"accessLogs": [
{
"path": "./logs/njetTest10319.log",
"formatName": "test"
}
]
},
{
"location": "/njetTest2",
"accessLogOn": false,
"accessLogs": [
{
"path": "./logs/njetTest20319.log",
"formatName": "test"
}
]
}
]
}
],
"accessLogFormats": [
{
"name": "test",
"format": "$remote_addr - $remote_user [$time_local] \\\"$request\\\" $status $body_bytes_sent \\\"$http_referer\\\" \\\"$http_user_agent\\\"",
"escape": "default"
}
]
}'
查看当前目录是没有任何日志信息的:
通过设置后,我们可以看到本地有一个空文件,通过请求Test1与Test2来查到,因为Test2没有开启日志,所以这里只有Test1写入日志成功了。
接着我们再次请求接口,将Test2的接口日志同时也开启来。
curl -X 'PUT' \
'http://121.41.236.243:8081/api/v1/config/http_log' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"servers": [
{
"listens": [
"0.0.0.0:8080"
],
"serverNames": [
""
],
"locations": [
{
"location": "/njetTest1",
"accessLogOn": true,
"accessLogs": [
{
"path": "./logs/njetTest10319.log",
"formatName": "test"
}
]
},
{
"location": "/njetTest2",
"accessLogOn": true,
"accessLogs": [
{
"path": "./logs/njetTest20319.log",
"formatName": "test"
}
]
}
]
}
],
"accessLogFormats": [
{
"name": "test",
"format": "$remote_addr - $remote_user [$time_local] \\\"$request\\\" $status $body_bytes_sent \\\"$http_referer\\\" \\\"$http_user_agent\\\"",
"escape": "default"
}
]
}'
可以看到Test2也同时有记录了日志,感觉通过API接口来进行动态的管理,非常的方便,不用再重复的去操作Conf文件。