先看下官方对OpenNJet的介绍:
OpenNJet 应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,OpenNJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器、流媒体服务器、负载均衡、代理(Proxy)、应用中间件、API网关、消息队列等产品形态等等。
OpenNJet 应用引擎介绍:
OpenNJet 在云原生架构中作为数据平面,除了提供南北向通信网关的功能以外,还提供了服务网格中东西向通信能力。在原有功能基础上增加了透明流量劫持、熔断、遥测与故障注入等新功能特性。
看完这段介绍大概了解到了,这个OpenNjet应用引擎是基于NGINX开发的。经过我的对比分析,确实是这样子的,如果你用过NGINX,亲自编译过NGINX你会发现OpenNJet的编译选项和NGINX的都是很像的。源代码也是类似,所以对于接触过NGINX的同学来说上手OpenNJet是很容易的。
官方给了你选择OpenNJet的理由:
性能无损动态配置:动态配置能力解决NGINX长期痛点,实时更改NGINX配置而无需重新启动服务器。不中断服务,快速响应流量需求变化。
因为我算是稍微深度使用过NGINX的用户,我用NGINX做过线上的代理服务,部署过web服务,在流媒体领域还做过RTMP服务,还做过静态资源库。
我是对OpenNJet的动态配置这个模块很感兴趣的,首先说一下我使用Nginx时遇到的缺陷:Nginx确实是存在你如果想修改了配置,必须要重启服务,这也是领人头疼的,一旦运行起来,如果重新启动一下,会造成很多额外的损失。
安装:
可以看到官方文档来看:https://njet.org.cn/docs/quickstart/,可以看到各个系统的安装教程。NJet官方提供centos,ubuntu,cloudOS等多个版本的2进制安装包,及软件源。
二进制安装包,可以从gitee的主仓库选择对应的版本进行下载,或通过软件源的方式自动获得后续的 更新,目前支持centos及ubuntu的软件源配置。除NJet主应用外,NJet的某些功能模块会通过独立的 二进制发行包进行可选安装,当前提供的有njet-otel模块,用于支持调用链跟踪。
Ubuntu通过deb包安装:
这种方式就是拿来即用。使用是没有问题的,当然了如果你要做个测试或者当做一个服务去使用的话,完全没有问题。但是你想进行二次开发的话,这个方式就行不通了,需要自己从头到尾编译一遍。
下载deb安装包:
https://gitee.com/njet-rd/njet/releases
root@iZbp1hfmpqxaf3x6i7ker9Z:~# wget https://gitee.com/njet-rd/njet/releases/download/v3.2.1/njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb
--2025-03-20 20:50:00-- https://gitee.com/njet-rd/njet/releases/download/v3.2.1/njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb
Resolving gitee.com (gitee.com)... 180.76.198.77, 180.76.198.225, 180.76.199.13
Connecting to gitee.com (gitee.com)|180.76.198.77|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://gitee.com/njet-rd/njet/attach_files/2030358/download/njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb [following]
--2025-03-20 20:50:01-- https://gitee.com/njet-rd/njet/attach_files/2030358/download/njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb
Reusing existing connection to gitee.com:443.
HTTP request sent, awaiting response... 302 Found
Location: https://foruda.gitee.com/attach_file/1737096946595142059/njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb?token=dfde8053500f3707e054c18c3f6b784f&ts=1742475001&attname=njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb [following]
--2025-03-20 20:50:01-- https://foruda.gitee.com/attach_file/1737096946595142059/njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb?token=dfde8053500f3707e054c18c3f6b784f&ts=1742475001&attname=njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb
Resolving foruda.gitee.com (foruda.gitee.com)... 180.76.198.77, 180.76.199.13
Connecting to foruda.gitee.com (foruda.gitee.com)|180.76.198.77|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16483120 (16M) [application/vnd.debian.binary-package]
Saving to: ‘njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb’
njet_3.2.1-1~ubuntu.18.04~bionic_am 100%[==================================================================>] 15.72M 536KB/s in 31s
2025-03-20 20:50:32 (515 KB/s) - ‘njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb’ saved [16483120/16483120]
root@iZbp1hfmpqxaf3x6i7ker9Z:~# dpkg -i njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb
Selecting previously unselected package njet.
(Reading database ... 89128 files and directories currently installed.)
Preparing to unpack njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb ...
Unpacking njet (3.2.1) ...
Setting up njet (3.2.1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/njet.service → /usr/lib/systemd/system/njet.service.
Processing triggers for libc-bin (2.39-0ubuntu8.4) ...
看着一句:Created symlink /etc/systemd/system/multi-user.target.wants/njet.service → /usr/lib/systemd/system/njet.service.
说明已经在系统中创建了service的方式。
功能体验:
如何控制njet服务,njet做到了系统的services里,可以使用systemctl命令来控制服务,这一点对于使用者来说很方便。
然后就可以启动njet服务和关闭njet服务了:
systemctl start njet #启动服务
systemctl stop njet #停止服务
查看是否启动成功
浏览器输入:http://127.0.0.1:8080/,出现如下界面既成功:
二、使用API接口动态管理access_log管理配置:
njet提供了API接口来动态操作这一切,例如启动成功后,如果你什么都没改,会有一个8081的端口,可以访问:http://127.0.0.1:8081/doc/swagger/ 进入 swagger的api文档。
找到上面“动态access log配置接口”这里,我们找到以下接口进行添加操作:
这里大概就是发送一个PUT请求,将日志设置的规则告诉Njet:
curl -X 'PUT' \
'http://47.96.21.133:8081/api/v1/config/http_log' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"servers": [
{
"listens": [
"0.0.0.0:8080"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"accessLogOn": true,
"accessLogs": [
{
"path": "./logs/access_log.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"
}
]
}'
可以看到我们设置成功规则后,在logs目录下确实生成了一个日志文件access_log.log,并且在页面请求时,也发现了相关的日志信息。
接下来,我们再动态设置一下其它的路径,看看是否也能生效呢?我们设置为access_log_back.log这个文件中。
可以看到当我们修改为access_log_back.log文件时,访问的日志就会跑到这个文件中,非常的方便来动态控制日志输出的文件位置。
总结:
本次体验我从3个角度来总结一下对OpenNjet的初体验。
-
上手快:对于使用者来说,如果使用者用过NGINX的话,用njet可以说是秒秒钟上手,真的很容易。因为一些相关的配置可以很完美的和NGINX融合,也可以看作为向下兼容。对于用户来说,我认为上手快就是一大特点。
-
易用:为什么说是易用呢,因为njet提供了多种配置njet的方式,还增加了动态配置的功能,拿API接口来说吧,这一点就打败了市场上很多普通web服务器。
-
第三方用户友好:因为有动态配置,对于第三方用户是无感的,企业修改一些配置,第三方用户如何还在进行着操作,此时是不受影响的,没有丝毫感觉。