OpenNJet:下一代云原生应用引擎
OpenNJet 应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,OpenNJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器、流媒体服务器、负载均衡、代理(Proxy)、应用中间件、API网关、消息队列等产品形态等等。OpenNJet 在云原生架构中作为数据平面,除了提供南北向通信网关的
OpenNJet 背景
OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,OpenNJet 具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。我们旨在适应国内特定的技术规范及标准,如国密算法套件支持、构建安全可控的云原生数据面,支撑我国云原生产业生态。
OpenNJet 介绍
OpenNJet 应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,OpenNJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器、流媒体服务器、负载均衡、代理(Proxy)、应用中间件、API网关、消息队列等产品形态等等。
OpenNJet 在云原生架构中作为数据平面,除了提供南北向通信网关的功能以外,还提供了服务网格中东西向通信能力。在原有功能基础上增加了透明流量劫持、熔断、遥测与故障注入等新功能特性。
OpenNJet 特性
性能无损动态配置
动态配置能力解决NGINX长期痛点,实时更改NGINX配置而无需重新启动服务器。不中断服务,快速响应流量需求变化。
灵活的CoPilot框架
旨在实现高性能的数据处理能力的同时提供方便扩展的管理接口,如指标输出、健康检查、管理界面、配置同步等以便灵活地、动态地监控、配置和管理系统的各个方面,同时确保数据面的稳定性和可靠性。
支持HTTP/3
HTTP/3采用了全新的底层传输协议即QUIC,为您提供更快、更可靠和更安全的Web浏览体验,保证互联网数据传输效率的同时减少用户等待,并增强网络的安全性。
支持国密
支持国密 SM2、SM3、SM4算法,场景主要为Server和反向代理两种场景,为您提供更强的数据保护,满足合规性。
企业级应用
提供集群状态同步及集群配额控制、高可用及运维文档一体化功能,可以帮助企业更好地实现自动化部署、持续集成和持续交付等 DevOps 实践。
高效安全
旨在提高现代应用的安全性、可用性和管理效率,特别是涉及到敏感数据、大规模集群和高可用性要求时,帮助企业更好地保护数据、提供可靠的服务,并简化运维任务。
OpenNJet 架构
- 以不同进程隔离数据面(workers)及控制管理能力(copilots),两者间主要通过共享内存共享数据;
- 利用 mqtt 协议构建底层 event bus,形成一套动态配置框架,第三方模块容易的实现动态配置改造;
- coworkers 采用插件机制,可以按需和不同的系统对接,实现不同的管控能力;
OpenNJet 功能规划
OpenNJet充分吸收了开源社区的建议,在功能规划上包含了4大类18类组件:
OpenNJet 总结
- 及时的国际/国家标准支持,如HTTP3, OpenNJet 会在2023年度发布的版本2.0完善支持;
- 内置企业特性,如集群规模的流量控制、高可用、API集成支持;
- 安全加固,如内置WAF、多种认证授权方式的集成;
- 动态能力,已经原生实现业界呼声最高的动态路由能力;
- 可编程性,OpenNJet 除了内置对HTTP 1/2/3的支持外,还支持利用脚本实现对特定应用协议的解析,并根据协议内容进行特定的路由;
- 数据、管控能力隔离,可观测性需要的指标、追踪数据采集不会影响对业务的处理,不会导致业务处理的性能降级;
- 适应面广,可适应本地、容器及云原生部署。
OpenNJet 快速开始
安装
NJet官方提供centos,ubuntu,cloudOS等多个版本的2进制安装包,及软件源。其中支持的有:
下载链接:
二进制安装包可以从 gitee 的主仓库选择对应的版本进行下载,或通过软件源的方式自动获得后续的更新,目前支持 centos 及 ubuntu 的软件源配置。除NJet主应用外,NJet的某些功能模块会通过独立的二进制发行包进行可选安装,当前提供的有njet-otel模块,用于支持调用链跟踪。
二进制安装
OpenNJet 提供多个版本操作系统下的二进制安装文件,二进制包安装后,所有 OpenNJet 相关的文件都在 /usr/local/njet 目录下,并在 /usr/lib/systemd/system 目录下添加 service 文件。
RPM 安装
- 从 gitee https://gitee.com/njet-rd/njet/releases 上下载对应操作系统的 rpm 格式安装包。
- 使用 yum 进行安装 例如下载的安装包是 njet-2.0.0-1.el7.x86_64.rpm,yum localinstall ./njet- 2.0.0-1.el7.x86_64.rpm
- 安装后,使用命令 systemctl start njet 启动服务,使用命令 systemctl stop njet 停止服务。
DEB 安装
- 从 gitee https://gitee.com/njet-rd/njet/releases 上下载对应操作系统的 deb 格式安装包。
- 使用 dpkg 进行安装,例如下载的安装包是njet_2.0.1-1~ubuntu.18.04~bionic_amd64.deb, dpkg -i ./njet_2.0.1-1~ubuntu.18.04~bionic_amd64.deb
- 安装后,使用命令 systemctl start njet 启动服务,使用命令 systemctl stop njet 停止服务。
源码安装
1、下载 OpenNJet 源码,如果要下载特定tag的源码,如v2.0.0,则执行:
git clone -b v2.0.0 git@gitee.com:njet-rd/njet.git
2、如果要下载最新源码,则执行:
git clone git@gitee.com:njet-rd/njet.git
3、如果要下载特定 branch(比如dynconf) 的源码,则执行:
git clone git@gitee.com:njet-rd/njet.git --branch=dynconf
4、如果要下载特定 branch(比如dynconf)的特定commit (ca5eaf057a5709a615a4873a1558c6d9fe1cc213)的源码,则执行:
git clone <remote_repository> --branch=<branch_name> --single-branch --depth=1
commit/ca5eaf057a5709a615a4873a1558c6d9fe1cc213
5、如果要下载特定 commit(ca5eaf057a5709a615a4873a1558c6d9fe1cc213)源码,则执行:
git clone -b ca5eaf057a5709a615a4873a1558c6d9fe1cc213 git@gitee.com:njet-rd/njet.git
编译
提供两种编译方法:
1. dockerfile 快速编译,不用宿主机安装依赖的编译环境以及软件。
依赖:docker 环境(需要在编译机器安装 docker 并启动 docker)
docker build -t njet_main:v1.0 .
docker run -v `pwd`:/njet_main njet_main:v1.0 /bin/bash -c "cd /njet_main &&
./build_cc.sh conf make"
2. 宿主机安装依赖环境以及软件 centos7 系统请安装如下软件:
gcc gcc-c++
libtool libtool-ltdl cmake3
make cmake perl perl-CPAN
zlib-devel cmake perl-IPC-Cmd
pkgconfig make vim-common
sudo m4 deltarpm openssl-devel
automake autoconf pcre2-devel
yum-utils rpm-build
ubuntu系统请安装如下软件:
gcc g++ make cmake libpcre2-dev
libpcre3-dev libssl-dev zlib1g-dev
perl m4 libtool automake
autoconf vim-common unzip libcap2-bin
编译命令
./build_cc.sh conf make
安装发行版
CentOs 发行版
现在 njet 支持 yum 源安装了,目前只支持 centos 7 和 x86_64架构。
1、首先生成 njet.repo
echo "
[opennjet]
name=OpenNJet
baseurl=https://njet.org.cn/download/linux/centos/$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://njet.org.cn/download/linux/centos/RPM-GPG-KEY-OpenNJet
" > /etc/yum.repos.d/njet.repo
2、更新 yum 缓存
yum clean all
yum makecache # 类似于 apt update
3、安装 njet 或 njet-otel
yum install njet
yum install njet-otel
4、启动 njet 服务
systemctl start njet
ubuntu 发行版
目前支持 Ubuntu 18.04/20.04/22.04 amd64 架构的操作系统通过APT源直接安装二进制软件包。
1、添加 gpg 文件
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://njet.org.cn/download/linux/ubuntu/gpg | sudo gpg --dearmor -
o /etc/apt/keyrings/njet.gpg
sudo chmod a+r /etc/apt/keyrings/njet.gpg
2、添加 APT 源
echo \
"deb [arch=$(dpkg --print-architecture) signed-
by=/etc/apt/keyrings/njet.gpg] https://njet.org.cn/download/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/njet.list > /dev/null
sudo apt-get update
3、安装,启动
sudo apt-get install njet
sudo systemctl start njet
目录文件
将 /usr/local/lib 目录添加到 /etc/ld.so.conf 文件,并使用 make install 安装编译后的依赖库,可执行文件,动态模块及默认配置文件。
sudo bash -c 'echo "/usr/local/lib" >> /etc/ld.so.conf'
sudo ./build_cc.sh install
启动
1. 通过源码编译安装的,可执行文件及相关的配置文件将安装到目录 /usr/local/njet
cd /usr/local/njet
sbin/njet
2. 通过 systemctl 起停
使用 rpm 或 deb 二进制安装后,会在 /usr/lib/systemd/system/ 目录下添加 service文件。
使用 sudo systemctl start njet 启动服务。
使用 sudo systemctl stop njet 停止服务
验证
通过浏览器或 curl/wget 访问部署机器的 8080 地址。
[root@njet ~]# curl http://localhost:8080/
<!DOCTYPE html>
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<title>Welcome </title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome </h1>
<p>If you see this page, web platform is successfully installed and
working. Further configuration is required.</p>
</body>
</html>
查看进程、端口
[root@njet ~]# ps aux|grep njet
njet 16778 0.0 0.2 169744 4408 ? Ss 10月03 0:00 njet: master process /usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf
njet 16779 0.2 0.2 170300 4652 ? S 10月03 0:11 njet: worker process
njet 16780 0.2 0.2 170300 5396 ? S 10月03 0:11 njet: worker process
njet 16781 0.6 0.6 195196 12976 ? S 10月03 0:27 njet: copilot process conf/njet_ctrl.conf
njet 16782 0.1 0.1 162884 2596 ? S 10月03 0:06 njet: copilot process
njet 16783 0.7 0.3 253948 5592 ? Sl 10月03 0:33 njet: copilot process conf/goaccess.conf
root 16784 0.2 0.1 177064 2120 ? S 10月03 0:11 njet: privileged agent process
root 19979 0.0 0.0 112724 988 pts/0 S+ 01:10 0:00 grep --color=auto nje
[root@njet ~]# netstat -anplut |grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 16778/njet: master
[root@njet ~]# lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
njet 16778 njet 6u IPv4 48813 0t0 TCP *:webcache (LISTEN)
njet 16779 njet 6u IPv4 48813 0t0 TCP *:webcache (LISTEN)
njet 16780 njet 6u IPv4 48813 0t0 TCP *:webcache (LISTEN)
功能特性
继承 nginx-1.23.1 所有功能,并且100%兼容nginx
Copilot框架 |
支持动态加载不同的外部copilot模块 支持外部模块异常退出的自动重启。 |
KV模块 | 支持键值的查询及设置 支持键值的持久化 |
动态配置框架 |
支持控制平面的消息发送 支持RPC消息、组播消息 |
快速上手
使用 OpenNJet 部署 Web Server
安装 OpenNJet
选择适合自己的安装方式安装即可
配置OpenNJet
OpenNJet 的主要配置文件为 njet.conf。可以通过修改该文件来配置 OpenNJet。
例如,以下是一个简单的 OpenNJet 配置文件示例,用于将所有请求重定向到一个 HTML 文件:
http {
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}
上述配置中,我们在 HTTP 块中定义了一个名为“server”的服务器块。该服务器块监听 80 端口,并将请求的根目录设置为 /var/www/html。如果请求的路径不存在,默认会返回 index.html 文件。
部署 Web 应用程序
在配置 NGINX之前,需要将 Web 应用程序部署到服务器上。可以将 Web 应用程序放置在服务器上的任何位置,只要在 NGINX配置文件中正确设置 root 目录即可。
启动 NJet
在完成 OpenNJet 配置后,可以通过以下命令启动 OpenNJet:
njet -p /tmpr/njet/ -c conf/njet.conf
常见启动参数:
-p 指定 prefix 配置文件路径,不指定,默认/etc/njet
-c 指定配置文件,不指定,默认 njet.conf
-e 指定 error 日志文件
访问 Web 应用程序
现在,可以使用 Web 浏览器访问 Web 应用程序。只需输入服务器的 IP 地址或域名即可访问 Web 应用程序。如果您按照上述示例配置 OpenNJet,则应将 Web 应用程序放置在 /var/www/html 目录中,并使用服务器的 IP 地址或域名访问它。
总之,上述步骤为您提供了一个基本的示例,您可以根据需要进行修改和定制。在实际部署 Web 应用程序时,可能需要更复杂的OpenNJet 配置,例如反向代理、负载平衡等。
如何通过 OpenNJet 部署反向代理 server
OpenNJet 支持反向代理功能的使用。
安装 OpenNJet
选择适合自己的安装方式安装即可
配置 njet.conf 配置文件
如下代码块所示,我们想要使用反向代理功能,需要使用 proxy_pass 指令来进行反向代理服务,proxy_pass 设置连接被代理服务器的协议、IP 地址或套接字,也可以是域名或 upstream 定义的服务器组,这里我们使用 upstream 作为上游资源服务器组。
http {
upstream backend1{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 9000;
location /{
proxy_pass http://backend1;
}
}
}
启动 OpenNJet,指定配置好的配置文件
在完成 OpenNJet 配置后,可以通过以下命令启动 OpenNJet:
njet -p /tmpr/njet/ -c conf/njet.conf
常见启动参数:
-p 指定 prefix 配置文件路径,不指定,默认/etc/njet
-c 指定配置文件,不指定,默认 njet.conf
-e 指定 error 日志文件
请求上游资源,验证反向代理服务
如果按照上述步骤进行部署与配置后,我们可以在 Centos 服务器命令行界面使用 curl 命令来请求上游服务器的资源,以此来验证反向代理服务是否部署成功。
[root@njet ~]# curl http://127.0.0.1:9000/test/hello.html
<!doctype html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
Njet Hello World!
</body>
</html>
如上方请求结果所示,请求上游服务器资源成功,成功通过反向代理服务请求到所需资源,可以根据具体需求来进行配置和使用。
如何使用 OpenNJet的动态配置功能
使用 OpenNJet动态配置功能有以下几种方式。
1、直接通过 curl 的方式。
以动态黑白名单为示例,执行命令:
curl -X GET http://127.0.0.1:8081/config/1/config/http_dyn_bwlist
可以得到当前包括动态和静态的黑白名单配置:
{
"servers": [
{
"listens": [
"0.0.0.0:90"
],
"serverNames": [
"localhost"
],
"locations": [
{
"location": "/"
},
{
"location": "/test_bwlist"
}
]
}
]
}
此时 OpenNJet 中没有添加任何的黑白名单。如果需要在某一路径下添加一个黑白名单,执行命令:
curl -X PUT http://192.168.40.119:8081/config/1/config/http_dyn_bwlist \ -d '{
"servers": [
{
"listens": [
"0.0.0.0:90"
],
"serverNames": [
"localhost"
],
"locations": [
{
"location": "/"
},
{
"location": "/test_bwlist",
"accessIpv4":
{
"rule": "deny",
"addr": "192.168.40.118",
"mask": "255.255.255.255"
}
}
]
}
]
}'
2、通过 Swagger 的进行动态配置
通过 swagger 的 url,http://njetaddr:8081/doc/swagger/ 进入 swagger 页面。
以 helper 进程主动健康检查为例,按照下图示例中内容,编辑好需要配置的 json 内容。
点击 execute,使用编辑好的 Json 数据调用该 API。
3、通过 GUI 的进行动态配置。
通过 GUI 页面,url:http://njetServIP:8081/doc/gui/ 进入 GUI 页面。
更多推荐
所有评论(0)