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进制安装包,及软件源。其中支持的有:

下载链接:

​​​​​​快速安装_文档-OpenNJet开源社区

二进制安装包可以从 gitee 的主仓库选择对应的版本进行下载,或通过软件源的方式自动获得后续的更新,目前支持 centos 及 ubuntu 的软件源配置。除NJet主应用外,NJet的某些功能模块会通过独立的二进制发行包进行可选安装,当前提供的有njet-otel模块,用于支持调用链跟踪。

二进制安装

OpenNJet 提供多个版本操作系统下的二进制安装文件,二进制包安装后,所有 OpenNJet 相关的文件都在 /usr/local/njet 目录下,并在 /usr/lib/systemd/system 目录下添加 service 文件。

RPM 安装

  1. 从 gitee https://gitee.com/njet-rd/njet/releases 上下载对应操作系统的 rpm 格式安装包​。
  2. 使用 yum 进行安装 例如下载的安装包是 njet-2.0.0-1.el7.x86_64.rpm,yum localinstall ./njet- 2.0.0-1.el7.x86_64.rpm​
  3. 安装后,使用命令 systemctl start njet 启动服务​,使用命令 systemctl stop njet 停止服务。​

DEB 安装

  1. 从 gitee https://gitee.com/njet-rd/njet/releases 上下载对应操作系统的 deb 格式安装包。​
  2. 使用 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​
  3. 安装后,使用命令 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 页面。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐