快速开始
安装
NJet官方提供centos,ubuntu,cloudOS等多个版本的2进制安装包,及软件源。其中支持的有:
OS | 架构 | 当前版本 | 下载链接 |
---|---|---|---|
Centos7.x | x86-64 | 3.1.0 | https://gitee.com/njet-rd/njet/releases/download/v3.1.0/njet-3.1.0-1.el7.x86_64.rpm |
Ubuntu18.04 | x86-64 | 3.1.0 | https://gitee.com/njet-rd/njet/releases/download/v3.1.0/njet_3.1.0-1~ubuntu.18.04~bionic_amd64.deb |
Ubuntu20.04 | x86-64 | 3.1.0 | https://gitee.com/njet-rd/njet/releases/download/v3.1.0/njet_3.1.0-1~ubuntu.18.04~bionic_amd64.deb |
Ubuntu22.04 | x86-64 | 3.1.0 | https://gitee.com/njet-rd/njet/releases/download/v3.1.0/njet_3.1.0-1~ubuntu.18.04~bionic_amd64.deb |
二进制安装包,可以从gitee的主仓库选择对应的版本进行下载,或通过软件源的方式自动获得后续的 更新,目前支持centos及ubuntu的软件源配置。除NJet主应用外,NJet的某些功能模块会通过独立的 二进制发行包进行可选安装,当前提供的有njet-otel模块,用于支持调用链跟踪,其安装参考«njet- otel安装说明»(todo)。
1. 二进制安装
OpenNJet 提供多个版本操作系统下的二进制安装文件,二进制包安装后,所有OpenNJet 相关的文件 都在 /usr/local/njet 目录下, 并在 /usr/lib/systemd/system 目录下添加service 文件。
1.1 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 停止服务
1.2 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 停止服务
2. 安装发行版
2.1 centos发行版
现在 njet 支持yum源安装了,目前只支持 centos 7 和 x86_64架构。 具体安装方式如下:
- 生成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
- 更新yum 缓存
yum clean all
yum makecache #类似于 apt update
- 安装 njet 或 njet-otel
yum install njet
yum install njet-otel
- 启动njet服务
systemctl start njet
2.2 ubuntu发行版
目前支持Ubuntu 18.04/20.04/22.04 amd64 架构的操作系统通过APT源直接安装二进制软件包 具体安装方式如下:
- 添加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
- 添加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
- 安装及启动
sudo apt-get install njet
sudo systemctl start njet
3. 源码安装
3.1 下载 OpenNJet 源码
如果要下载特定tag的源码,如v2.0.0,则执行:
git clone -b v2.0.0 git@gitee.com:njet-rd/njet.git
如果要下载最新源码,则执行:
git clone git@gitee.com:njet-rd/njet.git
如果要下载特定branch(比如dynconf)的源码,则执行:
git clone git@gitee.com:njet-rd/njet.git --branch=dynconf
如果要下载特定branch(比如dynconf)的特定commit (ca5eaf057a5709a615a4873a1558c6d9fe1cc213)的源码,则执行:
git clone <remote_repository> --branch=<branch_name> --single-branch --depth=1
commit/ca5eaf057a5709a615a4873a1558c6d9fe1cc213
如果要下载特定commit(ca5eaf057a5709a615a4873a1558c6d9fe1cc213)源码,则执行:
git clone -b ca5eaf057a5709a615a4873a1558c6d9fe1cc213 git@gitee.com:njet-rd/njet.git
3.2 编译:
提供两种编译方法:
-
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"
- 宿主机安装依赖环境以及软件 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
3.3 安装:
• 将 /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
4. 启动
4.1 手工起停
- 通过源码编译安装的,可执行文件及相关的配置文件将安装到目录/usr/local/njet
cd /usr/local/njet
sbin/njet
4.2 通过systemctl起停
使用 rpm 或 deb 二进制安装后,会在 /usr/lib/systemd/system/ 目录下添加 service文件。
使用 sudo systemctl start njet 启动服务。
使用 sudo systemctl stop njet 停止服务
5. 验证
通过浏览器或curl/wget访问部署机器的8080地址
curl http localhost:8080/
6.njet wsgi 安装
在以下两个rpm包或者deb包的基础上安装MrDoc应用并启动njet服务
6.1 安装两个rpm或者deb包
centos:
https://gitee.com/njet-rd/njet/releases/download/v3.1.0/njet-3.1.0-1.el7.x86_64.rpm
https://gitee.com/njet-rd/njet/releases/download/v3.1.0/njet-python-wsgi-3.1.0-1.el7.x86_64.rpm
ubunbu :
https://gitee.com/njet-rd/njet/releases/download/v3.1.0/njet_3.1.0-1~ubuntu.18.04~bionic_amd64.deb
6.2 使用njet自带的python环境
6.2.1 配置python环境
最好不配置到root用户,配置给njet用户比较好。防止系统混乱
ln -s /usr/local/njet/pyenv ~/.pyenv
chmod 777 /root/.pyenv/versions/3.8.19/bin/python3.8
6.2.2 将以下命令复制到~/.bashrc中,
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH=/usr/local/njet/pyenv/versions/3.8.19/bin/:$PATH
export LD_LIBRARY_PATH=/usr/local/njet/pyenv/versions/3.8.19/lib:$LD_LIBRARY_PATH
6.2.3 查看是否生效
bash
pip3 -V
which python3
python3 -V
6.3 创建一个最简单的wsgi应用
cd /usr/local/njet/apps
mkdir simple_wsgi
cd simple_wsgi
touch __init__.py
vim wsgi.py
wsgi.py:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello Return from python wsgi\n"]
最简单的应用如下:
6.4 NJet启动wsgi
6.4.1 njet.conf:
#load_module modules/njt_http_vtsc_module.so;
load_module modules/njt_http_location_module.so; #load_module modules/njt_agent_dynlog_module.so; #load_module modules/njt_http_dyn_map_module.so; #load_module modules/njt_stream_dyn_map_module.so; #load_module modules/njt_range_module.so;
#load_module modules/njt_http_dyn_range_module.so;
#load_module modules/njt_http_dyn_server_module.so;
# load_module modules/njt_http_upstream_api_module.so;
# load_module modules/njt_http_lua_module.so;
#load_module modules/njt_stream_lua_module.so;
#load_module modules/njt_http_multi_header_module.so;
load_module modules/njt_python_wsgi_module.so;
#load_module modules/njt_http_upload_module.so;
helper ctrl modules/njt_helper_ctrl_module.so /etc/njet/conf/ctrl.conf;
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
#helper broker modules/njt_helper_rsync_module.so conf/rsync.conf;
worker_processes auto;
# daemon off;
cluster_name helper;
node_name test_node1;
error_log logs/error.log info;
pid /etc/njet/njet.pid;
events {
worker_connections 1024;
}
python_stack_size 512k; #这个要设置得大一些
http {
include mime.types;
# python_include inc.py; #这个目前不需要测
# python_access "access(r)";#这个目前不需要测
# log_format postdata $request_body;
server {
listen 8080;
root /usr/local/njet/apps;
# location /test {
# enable_http_multi_part_parse;#这个目前不需要测
# python_content "content(r)"; #这个目前不需要测
# }
location / {
wsgi simple_wsgi;
}
}
}
6.4.2 需要配置ldconfig
#root 用户配置
cat << EOF >> /etc/ld.so.conf.d/njet.conf
/usr/local/njet/pyenv/versions/3.8.19/lib
EOF
ldconfig
6.4.3 设置环境变量,会在PYTHONPATH下查找对应的模块
export PYTHONPATH=/etc/njet:/usr/local/njet/apps
6.4.3.1 启动脚本如下:
sudo -u njet --preserve-env=PYTHONPATH /usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf
6.4.3.2 或者修改service
[Unit]
Description=njet
After=network.target
[Service]
Type=forking
User=njet
Group=njet
WorkingDirectory=/usr/local/njet
Environment="PYTHONPATH=/etc/njet:/usr/local/njet/apps"
ExecStart=/usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf
ExecStop=/usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf -s stop
ExecReload=/usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf -s reload
RestartPreventExitStatus=SIGKILL
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start njet
njet启动不需要配置其他的环境变量,例如PATH,LD_LIBRARY_PATH
因为njet启动过程中,在 python module初始化过程内增加了两个setenv,效果类似于下面两指令,只在njet启动后生效。
export PATH=/usr/local/njet/pyenv/versions/3.8.19/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/njet/pyenv/versions/3.8.19/lib:$LD_LIBRARY_PATH
6.5 访问njet 启动的应用
curl 127.0.0.1:8080
Hello Return from python wsgi
功能特性
继承 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 指令配置,实现对swagger、gui页面的访问 |
支持通过swagger 页面实现对各功能opentapi的访问 |
|
支持通过gui页面实现对动态模块配置修改的能力 |
|
telemetry(外部编译模块) |
支持http请求在不同server间的服务追踪 |
支持动态开关控制调用链的生成 |
|
正向代理(支持http/https) |
实现了HTTP CONNECT 方法支持http/https正向代理访问 |
vts模块 |
支持server的request、response、traffic、cache信息的统计,其中server的response可以按照response code进行分类统计,分类统计使用的response code为1xx、2xx、3xx、4xx、5xx |
支持upstream和cache信息的统计 |
|
支持通过内嵌的html页面进行统计信息的展示 |
|
支持通过Prometheus、grafana进行统计信息的展示 |
|
支持动态配置server的location统计开关,支持动态配置server的filter 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群:了解最新动态。
活动日历还在更新中···