博客 | NGINX

宣布推出 NGINX Plus R32

NGINX-F5-horiz-black-type-RGB 的一部分
Prabhat Dixit 缩略图
帕拉巴特·迪克西特
2024 年 5 月 28 日发布

我们很高兴地宣布 NGINX Plus Release 32 (R32) 已经上市。 NGINX Plus 基于 NGINX 开源,是唯一集 Web 服务器、负载均衡器、反向代理、内容缓存和 API 网关于一体的软件。

NGINX Plus R32 的新增功能和增强功能包括:

  • SSL 证书缓存- NGINX Plus R32 在配置大量具有重复 SSL 证书/密钥对的位置的情况下,显著改善了 NGINX 的启动时间和内存使用情况。
  • Stream_pass 模块- NGINX Plus R32 现在允许流模块充当路由器,允许有条件地将连接从流模块传递到其他模块(如 http、邮件)或传递回流本身。
  • NGINX Plus 官方容器镜像- NGINX Plus R32 引入了适用于特权和非特权容器运行时的官方 NGINX Plus 容器镜像。 此外,两种部署方法都附带可选的容器映像,其中包括 NGINX Agent,这是一个配套守护程序,可实现与 NGINX 管理平面解决方案的无缝集成。

该版本还包括从 NGINX 开源继承的新功能和错误修复以及对 NGINX JavaScript 模块的更新。

行为方面的重要变化

笔记: 如果您要从 NGINX Plus R31 以外的版本升级,请务必检查以前公告博客中的“行为的重要变化”部分,了解当前版本和此版本之间的所有版本。

弃用 OpenTracing 模块

NGINX Plus R18 中引入的 OpenTracing 模块已被弃用,并被标记为在 NGINX Plus R34 中删除。 在此之前,相关软件包将随所有 NGINX Plus 版本提供。 我们强烈建议用NGINX Plus R29中引入的OpenTelemetry 模块取代 OpenTracing 模块。

删除 ModSecurity 模块

ModSecurity 模块将于 2024 年 3 月 31 日终止支持。 因此,modsec 包已从 NGINX Plus 存储库中删除,并且以后将不再从 NGINX Plus 存储库中提供。

PGP 密钥更新

NGINX 开源和 NGINX Plus 包使用 PGP 密钥进行签名。 此密钥将于 2024 年 6 月 16 日到期。 我们已更新密钥的到期日期,因此现有软件包可以在 2024 年 6 月 16 日之后继续验证。 我们将生成新的密钥对来签署即将发布的软件包。

所有 NGINX 用户应按照以下步骤下载并安装更新的 PGP 密钥:

在 Ubuntu/Debian 上:

wget -qO - https://nginx.org/keys/nginx_signing.key | wget -qO - https://nginx.org/keys/nginx_signing.key | gpg --亲爱的 | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

在 RHEL/CentOS 上:

sudo rpm -e gpg-pubkey-7bd9bf62-5762b5f8
sudo rpm --import https://nginx.org/keys/nginx_signing.key

2024 年 6 月 16 日之后,您将无法验证软件签名,直到您更新密钥。

未来包装和发布政策

在未来的 NGINX Plus 版本中,我们将简化我们的打包和发布政策。 NGINX Plus 将仅在受支持的操作系统发行版的最新版本上构建和测试。 如果您在旧发行版上安装 NGINX Plus,您的包管理器可能会建议更新依赖库和包。

平台支持变更

此版本对支持的平台做出了以下更改。

支持的新操作系统:

  • Ubuntu 24.04

已删除旧操作系统:

  • FreeBSD 12 将于 2023 年 12 月 31 日达到 EOL

较旧的操作系统已弃用并计划在 NGINX Plus R33 中删除:

  • CentOS7/RHEL7/Oracle Linux 7
  • Alpine Linux 3.16

新功能详情

SSL 证书缓存可改善 NGINX 加载行为

以前,NGINX 每次在 NGINX 配置中引用时都会加载证书、密钥或证书吊销列表。 这意味着对同一对象的多次引用会导致相同次数的该对象的重新加载。 当继承诸如受信任证书列表之类的指令时,这种延迟会加剧。 在某些条件下,这种行为会严重影响 NGINX 启动时间,并且可能需要大量内存来存储配置。

在新的行为下,SSL 指令现在引用缓存的证书文件和相关对象。 因此,重复引用相同证书对象的配置的内存占用和加载时间大大减少。 在涉及大型 NGINX 配置的情况下,其好处最为明显,因为在大量位置块中引用了一小组受信任的证书。

以下是加载时间改进的可视化,其中 NGINX 配置了大约 5400 个位置块(顶级和嵌套)和 878 个证书。

加载时间改进

请注意图表右侧的加载时间显著下降,平均加载时间从更改前的约 40 秒减少到新行为下的约 6 秒。

将连接从流模块传递到其他模块

NGINX Plus R32 继承了NGINX 开源 1.25.5的一项功能,为 NGINX 添加了新的可配置层。具体来说,NGINX模块现在可以充当路由器,充当代理,能够将连接从流上下文传递到其他上下文(如 http、邮件)或流上下文本身内的单独虚拟服务器。

此功能作为此版本中引入的ngx_stream_pass_module 模块的一部分提供。 该模块有一个单独的指令“pass”,可用于指定传递客户端连接的地址。 该地址可以由 IP 地址和端口组合、套接字路径指定,或由 NGINX 变量引用。

借助此功能,希望通过单个 L4 端点运行所有流量的客户现在可以在 L4 流上下文中终止 SSL 连接,并将其传递给流上下文中的其他模块(http、邮件)或其他虚拟服务器。 此外,可以根据服务器名称或协议有条件地终止 SSL 连接,同时将剩余的流量代理到其他地方。 这解锁了一组用于管理来自单个端点的流量的新的可能的配置行为。

以下配置代码片段终止流模块中的 SSL 连接,并根据请求的服务器名称有条件地将它们传递给 http 上下文或流上下文中的另一个虚拟服务器。

http {
服务器 {
监听 8000;

位置 / {
返回 200 foo;
}
}
}

流 {
映射 $ssl_server_name $pass_port {
foo.example.com 8000;
默认 9001;

}

服务器 {
监听 9000 ssl;

ssl_certificate domain.crt;
ssl_certificate_key domain.key;

传递 127.0.0.1:$pass_port;
}
服务器{
监听 9001;
返回 bar\n;
}

}

在此示例中,所有 SSL 连接均在流服务器块终止。 根据传入请求中的服务器名称,连接将传递到监听端口 8000 的 http 服务器或监听端口 9001 的流虚拟服务器。

该模块的另一个应用解决第三方模块不支持 SSL 终止的用例。 在这种情况下,stream_pass 模块可以在将 TLS 加密连接传递给第三方模块之前终止它们。

此示例演示了RTMP 模块(本身不支持 SSL)如何使用 stream_pass 模块接受 TLS 加密流量。

rtmp {
服务器 {
听 1935;#rtmp

应用foo{

继续生活;
}
}
}

溪流 {
服务器 {
收听 1936 ssl; #rtmps

ssl_证书域.crt;
ssl_certificate_key 域.key;

传递 127.0.0.1:1935;
}
}

在此配置片段中,SSL 连接在流服务器块中终止并传递给 rtmp。 该连接对于 RTMP 模块来说似乎是未加密的,因此无需额外的定制或处理开销来支持 SSL 连接。

NGINX Plus 容器镜像

NGINX Plus R32 包括官方可用的 NGINX Plus 容器镜像,用于 NGINX Plus 的特权和非特权执行。 这两种容器类型都可选安装 NGINX Agent,以便轻松连接到 NGINX 支持的管理平面。 这些图像可以从 NGINX 注册表下载,网址为:private-registry.nginx.com。 按照这些说明使用您的 NGINX Plus 证书和密钥或 JSON Web Token (JWT) 访问图像。

NGINX Plus R32 中的其他增强功能和错误修复

MQTT 模块中的错误修复

  • 使用默认属性时数据包格式错误: 此版本修复了NGINX Plus R29 中引入的消息队列遥测传输(MQTT) 模块中导致数据包格式错误的问题。 以前,当属性字段存在且包含 MQTT Connect 消息中所有属性的默认值时,传出数据包的长度不考虑属性长度字段(1 字节)。 这导致数据包长度比预期的少 1 个字节,并导致数据包格式错误。 R32 中的修复解决了该问题。

zone_sync 模块中的错误修复

  • 重新加载配置时发生内存泄漏: 以前,待处理的队列同步操作使用从从未释放的不同池中分配的链链接。 这导致主进程以及所有工作进程出现内存泄漏。 此版本中的修复恢复为早期的区域同步实现,该实现使用循环池来处理待处理队列。

安全修复

在实验性的 HTTP3/QUIC 实施中发现并修复了以下潜在的安全问题。

  • 具有写入功能的堆溢出( CVE-2024-32760 ): 未公开的 HTTP/3 编码器指令可能会导致 NGINX 工作进程终止或造成其他可能的影响。
  • 堆栈溢出/释放后使用( CVE-2024-31079 ): 未公开的 HTTP/3 请求可能会导致 NGINX 工作进程终止或造成其他可能的影响。 这种攻击需要在连接耗尽过程中对请求进行特定的时间安排,攻击者对此没有可见性且影响有限。
  • 带有空头的空指针取消引用( CVE-2024-35200 ): 未公开的 HTTP/3 请求可能会导致 NGINX 工作进程终止或造成其他可能的影响。
  • QUIC 握手期间的内存泄露( CVE-2024-34161 ): 当网络基础设施支持 4096 或更大的最大传输单元 (MTU) 且无碎片时,未公开的 QUIC 消息可能会导致 NGINX 工作进程终止或导致先前释放的内存泄漏。

从 NGINX 开源版本继承的变更

NGINX Plus R32 基于NGINX Open Source 1.25.5 ,继承了自NGINX Plus R31发布(在 NGINX 1.25.4 和 1.25.5 中)以来的功能变化、特性和错误修复。

特征:

  • 流模块中的虚拟服务器。
  • ngx_stream_pass_module。
  • 流模块中的“listen”指令的“deferred”、“accept_filter”和“setfib”参数。
  • 某些架构的缓存行大小检测。
  • 支持 Apple Silicon 上的 Homebrew。

错误修复:

  • Windows 交叉编译错误修复和改进。
  • 在 QUIC 中使用 0-RTT 时出现意外连接关闭。
  • 在正常关闭旧工作进程期间,带有待处理的 AIO 操作的连接可能会过早关闭。
  • 在正常关闭旧工作进程后请求快速关闭时,不再记录套接字泄漏警报。
  • 如果在子请求中使用了 AIO,则可能会发生套接字描述符错误、套接字泄漏或工作进程(用于 SSL 代理)中的分段错误。
  • 如果将 SSL 代理与“image_filter”指令一起使用,并使用“error_page”指令重定向代码为 415 的错误,则工作进程中可能会发生分段错误。
  • HTTP/3 中的错误修复和改进。

安全:

  • 当使用 HTTP/3 时,工作进程在处理特制的 QUIC 会话时可能会出现分段错误( CVE-2024-24989CVE-2024-24990 )。

有关从最新版本继承的新更改、功能、错误修复和解决方法的完整列表,请参阅 NGINX更改文件。

NGINX JavaScript 模块的变更

NGINX Plus R32 吸收了 NGINX JavaScript (njs) 模块版本 0.8.4 的变化。 以下是自 0.8.2(NGINX Plus R31 附带的版本)以来 njs 的显著变化列表。

特稿

  • 功能:可以设置传出标头的服务器标头。
  • 特征: CLI 中支持 QuickJS 引擎。

更改

  • 改进:r.subrequest() 中 URI 和 args 参数的验证。
  • 改进:检查重复的 js_set 变量。

问题修复

  • 错误修复:修复了 Headers.set()。
  • 错误修复:使用缓冲区值修复了 js_set。
  • 错误修复:当未指定超时时,修复共享字典的 clear() 方法。
  • 错误修复:当启用 js_periodic 时修复 stub_status 统计数据。
  • 错误修复:使用 libxml2 2.12 及更高版本进行构建。
  • 错误修复:修复日期构造函数溢出和 NaN 值的问题。
  • 错误修复:修复了 querystring.parse() 中的下溢。
  • 错误修复:修复了 String.prototype.match() 中潜在的缓冲区过度读取问题。
  • 错误修复:修复了 for-in 循环的解析。
  • 错误修复:修复了没有数字的十六进制、八进制和二进制文字的解析。
  • 错误修复:修复了未引入超时的共享字典的 clear() 方法0.8.3
  • 错误修复:修复了共享字典的 r.send() 方法,没有使用 Buffer 参数的超时问题。
  • 错误修复:使用非填充的 base64 字符串修复了 atob()。

有关所有功能、更改和错误修复的完整列表,请参阅 njs变更日志

升级或尝试 NGINX Plus

如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到 NGINX Plus R32。 除了所有出色的新功能之外,您还将获得一些额外的修复和改进,这使得 NGINX 可以在您需要提出支持单时更轻松地为您提供帮助。

如果您不是 NGINX Plus 用户,我们鼓励您尝试一下。 您可以将其用于安全、负载均衡和 API 网关用例,或将其用作具有增强的监控和管理 API 的完全支持的 Web 服务器。 立即开始30 天免费试用


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”