OpenNJet 最早是基于 Nginx 1.19 基础 fork 并独立演进,随着 Nginx 版本迭代,吸收上游 Nginx 的更新,已经同步更新到 Nginx1.23.1 版本,OpenNJet 具有高性能、稳定、易扩展的特点,同时也解决了 Nginx 长期存在的难于动态配置、管理功能影响业务等问题。我们目标在于适应国内特定的技术规范及标准,如国密算法套件支持、构建安全可控的云原生数据面,支撑我国云原生产业生态。
技术架构
功能特性
继承 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 会话保持 |
最新版本:2.0
在2023年12月下旬发布的 v2.0.0 版本中,对基础框架进行了大幅优化,增加对 HTTP/3 的支持,进一步丰富了 OpenNJet 的生态,动态能力逐渐成熟。此次更新主要包括以下五个方面:
基础框架大幅优化:框架的优化对于 CoPilots 进行了加固,实现了 lua vm、高权限执行框架、配置沙箱等能力,从而进一步提高 OpenNJet 的稳定性以及执行效率。
成熟的动态能力:对模块继续进行动态化改造,优化了动态证书管理,覆盖企业灰度发布等关键场景,动态 location 能力在 v2.0.0 已经进入成熟阶段。
加入新协议 HTTP/3:主要实现了 HTTP/3 的 Server 能力,以及 ftp 协议的代理能力。在安全的基础上实现灵活的负载均衡
继续强化高效安全:强化系统安全,加固自身;实现了业务安全,业务修复无损性能,更好的保护数据、提供可靠的服务,并简化运维任务。
两个企业特性:实现集群的基本构建,从而避免在故障转移、集群扩容新增加节点等人工操作,减少业务中断时间而无损性能;尝试引入智能化,合理分配资源。
最新版本:3.2
2025年1月上旬发布的这个版本中,NJet 实现重大突破,提供了动态 Upstream 的能力。这是一个关键的特性,使得其可以按需动态管理上游服务器池,从而使得业务方可以按需配置资源池,实现业务分区、算法切换;结合动态路由技术,NJet 可以在不依赖外部逻辑的情况下,实现复杂的灰度需求。这个功能实现的较晚,是因为底层的动态共享内存技术在上个版本才发布,稳定后才引入进来。而且,目前的动态 Upstream,还局限在 HTTP 代理层面, 通用的 TCP 代理的动态 Upstream 支持,还要等下个开发周期实现。
此外,上个版本发布的 “动态协议框架” 能力,在这个版本中得到了具体应用。利用这个特性,我们在这个版本中快速实现了一系列的协议转换及代理功能,满足了 NJet 企业版及客户的需求,比如一系列的 xxx over websocket, 利用 websocket 做传输层,实现 WEB 端直通后端的 xxx 服务器。具体是 NJet 在项目中碰到了一个不支持 websocket 的 MQTT broker,利用 “动态协议框架”, NJet 仅仅利用了数百行脚本代码,就实现了一个 websocket 2 MQTT proxy 模块,在后端 broker 不改动的情况下,实现了前端可以通过 websocket 协议访问该 Broker。另外在本版本上,实现了多个客户反馈的功能需求, 像 FTP 代理功能支持 IPv6, Cache 模块对于缓存溢出的优化、Subfilter 模块对于可过滤条目的扩充等,在此也感谢客户的及时反馈。
官方主页:https://njet.org.cn/