NGINX Plus R32 正式发布

NGINX | 2024年5月28日

我们很高兴地宣布,NGINX Plus Release 32 (R32)现已发布。NGINX Plus基于NGINX Open Source构建,是一款集软件Web服务器、负载均衡器、反向代理、内容缓存和API网关于一体的解决方案。

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

  • SSL证书缓存:对于包含大量位置且重复使用SSL证书/密钥对的配置,NGINX Plus R32显著缩短了NGINX启动时间,并减少了内存使用量。
  • Stream_pass 模块,NGINX Plus R32现在支持将stream模块用作路由器,可根据条件将连接从stream模块传递到http、mail等其他模块,或传回stream模块本身。
  • NGINX Plus官方容器镜像:NGINX Plus R32现已提供适用于特权和非特权容器运行时的官方NGINX Plus容器镜像。此外,这两种部署方式均提供可选的容器镜像,其中包含NGINX Agent。NGINX Agent是一款配套守护进程,可与NGINX管理平面解决方案无缝集成。

本次发布还包含继承自NGINX开源版的新功能和错误修复,以及对NGINX JavaScript模块的更新。

重要行为变更

注意:如果从NGINX Plus R31以外的版本升级,请务必查看重要行为变更部分,具体请参阅之前的版本公告博客,并检查当前版本与此版本之间的所有版本。

弃用OpenTracing模块

NGINX Plus R18中引入的OpenTracing模块即将弃用,并计划在NGINX Plus R34中移除。在此之前,所有NGINX Plus版本仍将提供相关软件包。强烈建议将OpenTracing模块替换为OpenTelemetry模块,该模块在NGINX Plus R29中引入。

移除 ModSecurity 模块

ModSecurity模块已于2024年3月31日终止支持。因此,modsec软件包已从NGINX Plus存储库中移除,今后将不再通过NGINX Plus存储库提供。

PGP 密钥更新

NGINX Open Source和NGINX Plus软件包使用PGP密钥签名。该密钥原定于2024年6月16日到期。我们已更新密钥的到期日期,以便现有软件包在2024年6月16日之后仍可继续通过验证。我们将生成新的密钥对,为后续版本的软件包签名。

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

在Ubuntu/Debian上:

wget -qO - https://nginx.org/keys/nginx_signing.key | gpg --dearmor | 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日终止支持

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

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

新功能详解

通过SSL证书缓存改善NGINX负载行为

以前,每当NGINX配置引用证书、密钥或证书吊销列表时,NGINX都会加载相应对象。这意味着,同一对象被引用多少次,就会重新加载多少次。继承受信任证书列表等指令时,这种延迟还会叠加。在某些情况下,此行为会显著影响NGINX的启动时间,并且可能需要大量内存来存储配置。

采用新行为后,SSL指令现在会引用已缓存的证书文件及相关对象。因此,对于重复引用相同证书对象的配置,内存占用和加载时间均大幅减少。当大型NGINX配置中的大量location块引用少量可信证书时,这一优势尤为明显。

下图直观展示了加载时间的改善情况,其中NGINX配置了约5,400个location块(包括顶层和嵌套块)以及878个证书。

加载时间缩短

请注意图表右侧的加载时间显著下降:平均加载时间从更改前的约40秒降至采用新行为后的约6秒。

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

NGINX Plus R32继承了NGINX开源版1.25.5的一项功能,为NGINX新增了一层可配置能力。具体而言,NGINX stream模块现在可充当路由器和代理,将连接从stream上下文传递到http、mail等其他上下文,或传递到stream上下文中的其他虚拟服务器。

此功能由本版本引入的ngx_stream_pass_module module提供。该模块只有一个“pass”指令,可用于指定客户端连接的转发地址。该地址可通过IP地址与端口的组合或套接字路径指定,也可使用NGINX变量引用。

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

以下配置片段在stream模块中终止SSL连接,并根据请求的服务器名称,有条件地将连接传递到http上下文或stream上下文中的其他虚拟服务器。

http {
    server {
        listen 8000;

        location / {
            return 200 foo;
        }
    }
}

stream {
	 map $ssl_server_name $pass_port {
		foo.example.com 8000;
		default 9001;
	
	}

    server {
        listen 9000 ssl;

        ssl_certificate     domain.crt;
        ssl_certificate_key domain.key;

        pass 127.0.0.1:$pass_port;
    }
	server{
		listen 9001;
		return bar\n;
	}

}

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

该模块的另一种应用场景是第三方模块不支持SSL终止。在这种情况下,stream_pass模块可以先终止TLS加密连接,再将连接传递给第三方模块。

此示例演示了RTMP模块在原生不支持SSL的情况下,如何使用stream_pass模块接收TLS加密流量。

rtmp {
    server {
        listen 1935;#rtmp
	
	application foo{
		
		live on;
        }
    }
}

stream {
    server {
        listen 1936 ssl; #rtmps

        ssl_certificate     domain.crt;
        ssl_certificate_key domain.key;

        pass 127.0.0.1:1935;
    }
}

在此配置片段中,SSL连接在stream server块中终止,然后传递给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模块中的错误修复

  • 使用默认属性时出现格式错误的数据包: 此版本修复了一个会导致消息队列遥测传输(MQTT)模块生成格式错误数据包的问题,该问题自NGINX Plus R29起引入。此前,如果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 Open Source 的更改

NGINX Plus R32基于NGINX Open Source 1.25.5,并继承了自NGINX Plus R31发布以来在NGINX 1.25.4和1.25.5中引入的功能变更、新功能和错误修复。

功能:

  • stream模块中的虚拟服务器。
  • ngx_stream_pass_module。
  • stream模块中“listen”指令的“deferred”、“accept_filter”和“setfib”参数。
  • 针对部分架构的缓存行大小检测。
  • 支持在Apple Silicon上使用Homebrew。

错误修复:

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

安全性:

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

NGINX JavaScript 模块的变更

NGINX Plus R32整合了NGINX JavaScript(njs)模块0.8.4版中的变更。以下列出了njs自0.8.2版(NGINX Plus R31随附的版本)以来的重要变更。

功能

  • 功能:可以设置传出标头中的 Server 标头。
  • 功能:CLI支持QuickJS引擎。

变更

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

错误修复

  • 错误修复:修复了 Headers.set()。
  • 错误修复:修复了js_set处理Buffer值时的问题。
  • 错误修复:修复了未指定超时时间时共享字典的 clear() 方法。
  • 错误修复:修复了启用js_periodic时的stub_status统计问题。
  • 错误修复:修复了使用libxml2 2.12及更高版本时的构建问题。
  • 错误修复:修复了 Date 构造函数在值溢出或为 NaN 时的问题。
  • 错误修复:修复了 querystring.parse() 中的下溢问题。
  • 错误修复:修复了String.prototype.match()中潜在的缓冲区越界读取问题。
  • 错误修复:修复了for-in循环的解析问题。
  • 错误修复:修复了对不含数字的十六进制、八进制和二进制字面量的解析。
  • 错误修复:修复了在0.8.3中引入的无超时共享字典的clear()方法问题。
  • 错误修复:修复了共享字典的 r.send() 方法在未设置超时且使用 Buffer 参数时出现的问题。
  • 错误修复:修复了 atob() 无法处理未填充的 base64 字符串的问题。

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

升级或试用 NGINX Plus

如果您正在运行NGINX Plus,强烈建议尽快升级到NGINX Plus R32。除了新增功能外,此版本还包含多项修复和改进,便于NGINX在您需要提交支持工单时提供帮助。

如果您尚未使用NGINX Plus,建议亲自体验。NGINX Plus可用于安全、负载均衡和API网关等用例,也可作为提供全面支持的Web服务器,并配备增强的监控和管理API。立即开始30天免费试用。

分享
标签: F5 NGINX, News

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。