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

快速开始

安装

提供基于 Dockerfile 文件的形式进行快速编译

  • 依赖:docker 环境(需要在编译机器安装docker并启动docker)
  • 步骤:
  1. 下载 OpenNJet 源码
  2. 执行如下命令:
     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"
  1. 编译完后,在 objs 目录下,主要包含 njet 文件和相关的 so 文件

njet 可执行文件

*.so 相关模块对应的动态库文件 \

  1. 在任意目录下创建目录,用作存储njet项目
  2. 进入当前创建的目录并创建 logs modules 、conf 、 data 、sbin 4个目录
mkdir logs
mkdir data
mkdir conf
mkdir sbin

  1. ojbs目录中的所有so文件复制到modules; 将objs目录中的njet文件复制到sbin目录
cp objs/njet sbin
cp objs/*.so  modules

  1. njet 可执行文件需要设置 cap_setuid, 否则privilege agent 进程会启动失败
sudo /usr/sbin/setcap cap_dac_override,cap_dac_read_search,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_setuid=eip /etc/njet/sbin/njet

  1. 进入sbin目录,使用 ./njet -p 项目目录 -c 项目目录/conf/njet.conf 启动njet

njet.conf(数据面)


worker_processes auto;

cluster_name njet;
node_name node1;

error_log logs/error.log error;

helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
helper broker modules/njt_helper_broker_module.so;

load_module modules/njt_http_split_clients_2_module.so;  
load_module modules/njt_agent_dynlog_module.so;  
load_module modules/njt_http_dyn_bwlist_module.so; 
load_module modules/njt_dyn_ssl_module.so;
load_module modules/njt_http_vtsc_module.so;
load_module modules/njt_http_location_module.so;
#load_module modules/njt_http_lua_module.so;

events {
    worker_connections  1024;
}

http {
    include mime.types;
    access_log off;
    vhost_traffic_status_zone;
    server {
        listen       8080;
        location / {
           root html;
        }
    }
}


njet_ctrl.conf (控制面)

load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_ctrl_config_api_module.so; 
load_module modules/njt_helper_health_check_module.so;
load_module modules/njt_http_upstream_api_module.so; 
load_module modules/njt_http_location_api_module.so;
load_module modules/njt_doc_module.so;
load_module modules/njt_http_vtsd_module.so;
load_module modules/njt_http_ssl_api_module.so;       

error_log logs/error-ctrl.log info;

events {
    worker_connections  1024;
}

http {
    include mime.types;
    server {
        listen       8081;
        
        keepalive_timeout 0;
        
        location / {
            return 200 "njet control panel\n";
        }
        location /hc {
            health_check_api;
        }
        
        location /api {
             api write=on;
        }
        
        location /kv {
            dyn_sendmsg_kv;
        }
        
        location /config {
            config_api;
        }
        
        location /doc {
            doc_api;
            limit_except PUT{
               auth_basic "NGINX plus API";
               auth_basic_user_file /etc/nginx/htpasswd;
            }
        }
          location /dyn_loc {
           dyn_location_api;
        }
        location /ssl {
            dyn_ssl_api;  
            limit_except POST {
               auth_basic "NGINX plus API";
               auth_basic_user_file /etc/nginx/htpasswd;
            }       
        }
        location /metrics {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

mime.types


types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/avif                                       avif;
    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/wasm                                 wasm;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}


otel.conf

exporter = "otlp"
processor = "batch"

[exporters.otlp]
#collector server address
# Alternatively the OTEL_EXPORTER_OTLP_ENDPOINT environment variable can also be used.
host = "192.168.40.136"
port = 4317

[processors.batch]
max_queue_size = 2048
schedule_delay_millis = 5000
max_export_batch_size = 512

[service]
# Can also be set by the OTEL_SERVICE_NAME environment variable.
name = "njet-proxy" # Opentelemetry resource name

[sampler]
name = "AlwaysOn" # Also: AlwaysOff, TraceIdRatioBased
ratio = 0.1
parent_based = false


opentelemetry_module.conf

NjetModuleEnabled OFF;
NjetModuleOtelSpanExporter otlp;
NjetModuleOtelExporterEndpoint 192.168.40.136:4317;  #改成自己的ip,端口无需更改
NjetModuleServiceName DemoService;
NjetModuleServiceNamespace DemoServiceNamespace;
NjetModuleServiceInstanceId DemoInstanceId;
NjetModuleResolveBackends ON;           #固定值,不做修改
NjetModuleTraceAsInfo ON;          

rpm 安装运行

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

/usr/local/njet
├── conf (配置文件)
├── data (持久化消息及kv store)
├── lib (c依赖库)
├── logs (日志文件)
├── lualib (Lua依赖库)
├── modules (njet 动态模块)
├── sbin (njet 可执行文件)\

RPM格式

  • 从官网下载对应操作系统的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 停止服务

功能特性

继承 nginx-1.23.1 所有功能, 并且100%兼容nginx

OpenNJet 功能特性

Copilot框架

支持动态加载不同的外部copilot模块

支持外部模块异常退出的自动重启

KV模块

支持键值的查询及设置

支持键值的持久化

动态配置框架

支持控制平面的消息发送

支持RPC消息、组播消息

支持消息持久化

Cache-purge

支持缓存清理

支持按指定前缀清理缓存

开启分片后修改源文件不会造成下载失败

health_check

支持单独在helper进程开启健康检查,不影响数据面业务

支持运行时动态开启或关闭健康检查功能

支持校验返回http code

支持校验返回http header

支持校验返回http body

支持https健康检查

支持强制健康检查,以及持久化功能

支持国密https健康检查

Split-clients-2

支持蓝绿发布

支持运行时动态调整流量比例

黑白名单

支持黑名单方式进行访问IP的限制

支持白名单方式进行访问IP的限制

 支持运行时动态设置IPv4的黑白名单列表 

doc模块

支持location 级别通过doc_api 指令配置,实现对swaggergui页面的访问

支持通过swagger 页面实现对各功能opentapi的访问

支持通过gui页面实现对动态模块配置修改的能力

telemetry(外部编译模块)

支持http请求在不同server间的服务追踪

支持动态开关控制调用链的生成

正向代理(支持http/https

实现了HTTP CONNECT 方法支持http/https正向代理访问

vts模块

支持serverrequestresponsetrafficcache信息的统计,其中serverresponse可以按照response code进行分类统计,分类统计使用的response code1xx2xx3xx4xx5xx

支持upstreamcache信息的统计

支持通过内嵌的html页面进行统计信息的展示

支持通过Prometheusgrafana进行统计信息的展示

支持动态配置serverlocation统计开关,支持动态配置serverfilter key

国密支持

支持server中使用国密

支持反向代理中使用国密

支持国密双证证书

动态(国密)证书更新

动态access log

支持运行中动态关闭access log功能

支持运行中动态修改写入的日志文件

支持运行中切换syslog服务器

支持运行中切换写入文件的变量

支持运行时增加日志format

支持运行时修改日志format

声明式API

支持感知声明式模块注册

支持查询声明式模块查询

支持PUT方式更新声明式配置

边车支持

支持流量劫持,兼容istio 规则

支持协议识别

支持代理http1.1

支持 istio 的双向认证(service-to-service mTLS)

动态location 支持

支持通过api vs 添加 location

支持通过api vs中删除已经添加的location

动态upstream api 支持

支持通过api,对http stream 中的upstream 信息进行查询

支持通过api,对http stream 中的upstream server 进行, 添加,修改,删除

支持通过api,对http stream 中的upstream 的统计信息进行重置

支持post 添加的upstream server 持久化或非持久化 

动态域名upstream server

支持静态配置upstream server 域名的reslove 属性,定时解析域名,根据域名对应的ip 增减结果,同步更新到upstream server 列表中

支持通过upstream api post接口,添加server 域名,并定时解析域名

Http 会话保持支持

支持cookie 会话保持

支持route 会话保持

支持lear 会话保持 

负载均衡

slow_start 慢启动功能,针对轮询算法,实现server新增或故障转正常后,业务的流量在指定时间,缓慢增长

动态SSL证书

动态ssl证书功能由声明式api改为命令式api

动态配额功能

配额(limit conn、limit rps、limit rate)功能声明式 API 动态化配置

组播集群

  组播gossip构建集群功能
  基于组播实现app_stickey 会话同步功能
  基于组播实现limit connection集群连接数限制功能
  基于组播实现limit rps集群请求数限制功能

动态worker数量调整

动态调整worker进程数量

HA Copilot

提供HA Copilot模块,NJet多个实例间支持VIP的配置

贡献指南

贡献从哪里开始入手?

开始入手

初阶入门:从快速上手开始

文档贡献:当然您也可以考虑从文档贡献

高阶挑战:先来两个优化任务练练手

问题反馈:

1、提交 Issue 反馈问题

2、描述如何重现该问题(可选)

3、可提供解决方案(可选)

4、提交PR以解决问题(可选)

如果您想为OpenNJet贡献一个新功能点:

1、提出 issue 指出你想要的新功能以及原因

2、在 issue 中指出这个功能的实现方案以及测试大纲(可选)

3、提出PR实现这个新的功能

如果您对现有的已经存在的问题感兴趣:

1、您可以在标有bug、improvement和enhancement的issue标签内帮助他人。您可以选择给出对应的解决方案,并提交PR修复该issue

2、在标有question标签的issue内回答问题帮助他人

参加社区活动

如果您对现有的活动感兴趣:

欢迎关注我们的活动页面或者关注我们的QQ群:了解最新动态。

活动日历还在更新中···