我们很高兴地宣布 NGINX Plus Release 31 (R31) 已经推出。 NGINX Plus 基于 NGINX 开源,是唯一集 Web 服务器、负载均衡器、反向代理、内容缓存和 API 网关于一体的软件。
NGINX Plus R31 的新增功能和增强功能包括:
该版本还包括从 NGINX 开源继承的新功能和错误修复以及对 NGINX JavaScript 模块的更新。
笔记: 如果您要从 NGINX Plus R30 以外的版本升级,请务必检查以前公告博客中的“行为中的重要变化”部分,了解当前版本和此版本之间的所有版本。
NGINX Plus R18 中引入的 OpenTracing 模块现已弃用。 从 NGINX Plus R34 的未来版本开始它将被删除。 在此之前,该软件包将与所有 NGINX Plus 版本一起提供。 强烈建议使用 NGINX Plus R29 中引入的OpenTelemetry 模块。
NGINX Plus 用户需要向 F5 报告其 NGINX 使用情况以满足合规要求。 随着 NGINX Plus R31 的发布,向NGINX 实例管理器报告 NGINX 使用情况的功能已原生存在且默认启用。 如果 NGINX 实例由于任何原因无法向 NGINX 实例管理器提供其使用信息,则会记录一条警告消息。
有关如何在您的环境中配置此功能的详细信息,请参阅本机 NGINX 使用情况报告部分。
支持的新操作系统:
已删除旧操作系统:
NGINX Plus R32 中已弃用并计划删除的旧操作系统:
NGINX Plus R31 引入了与网络上的 NGINX 实例管理器的本机通信,以自动化许可合规性。 如果您参与F5 Flex 消费计划,您将不再需要手动跟踪您的 NGINX Plus 实例。
默认情况下,NGINX Plus 将在启动时尝试通过nginx-mgmt.local
主机名的 DNS 查找来发现 NGINX 实例管理器。 虽然主机名是可配置的,但我们建议(为简单起见)向您的本地 DNS 添加 A 记录,将默认主机名与运行 NGINX 实例管理器的系统的 IP 地址关联。 然后,NGINX Plus 将与 NGINX 实例管理器建立 TLS 连接,每三十分钟报告一次其版本号、主机名和唯一标识符。
为了增加安全性,我们还建议使用可选的mgmt
配置块来配置此连接和 mTLS。 NGINX 实例管理器将定期向 F5 服务报告 NGINX Plus 实例的总使用情况。
如果 NGINX Plus 在解析nginx-mgmt.local
主机名或与 NGINX 实例管理器通信时遇到任何问题,您将在错误日志中看到一条警告消息。
这是一个错误消息示例,表明 NGINX Plus 实例无法解析nginx-mgmt.local
:
2023/12/21 21:02:01 [警告] 3050#3050:使用情况报告:未找到解析端点“nginx-mgmt.local”的主机
下面是一个错误消息示例,表明 NGINX Plus 实例在与 NGINX 实例管理器通信时遇到困难:
2023/12/21 21:02:01 [警告] 3184#3184:使用情况报告:连接超时
管理
配置块设置如果您希望微调 NGINX Plus 实例与 NGINX 实例管理器的通信方式,您可以选择使用新的mgmt
配置块和相关指令。 这样做可以让您定义自定义解析器,使用 IP 地址或备用主机名来识别您的 NGINX 实例管理器系统,指定 TLS 选项,使用 mTLS 增强安全性,并指定其他自定义参数。
以下是自定义配置的示例:
mgmt {
usage_report end=instance-manager.local interval=30m;
resolver 192.168.0.2; # 示例内部 DNS IP
uuid_file /var/lib/nginx/nginx.id;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers DEFAULT;
ssl_certificate client.pem;
ssl_certificate_key client.key;
ssl_trusted_certificate trust_ca_cert.crt;
ssl_verify on;
ssl_verify_depth 2;
}
有关这些指令的更多详细信息,请参阅产品文档。
有关下载和安装 NGINX 实例管理器的更多信息,请参阅安装指南。
笔记: 如果您使用的是早期版本的 NGINX Plus,您仍然可以按照以下说明报告您的实例。
在此版本之前,NGINX Plus 假定上游组中的所有服务器都是相同的。 这意味着他们需要能够回答相同的请求,响应相同的 SNI 名称(当使用proxy_ssl_server_name
时),并返回与相同名称匹配的 SSL 证书。
然而,在某些情况下,这种行为是不够的。 例如,如果多个虚拟服务器在上游服务器后面共享,并且需要通过不同的 SNI 和/或主机标头来区分,以将请求路由到特定资源。 也有可能上游组中的所有服务器不能使用同一个证书,或者将上游服务器放入单独的上游组存在限制。
NGINX Plus R31 引入了对每个上游服务器配置的 SNI 支持。 变量$upstream_last_server_name
指的是所选上游服务器的名称,然后可以使用proxy_ssl_server_name
和proxy_ssl_name
指令将其传递给代理服务器。
下面展示了如何将proxy_ssl_server_name
设置为on ,从而使服务器名称能够通过 SNI:
proxy_ssl_server_name 开启;
以下是如何使用proxy_ssl_name
传递选定的上游服务器名称:
proxy_ssl_name
$upstream_last_server_name;
NGINX JavaScript v0.8.1 引入了一个新的指令js_periodic
,可在http
和stream
上下文中使用。 该指令允许指定定期运行的 JavaScript 内容处理程序。 这在自定义代码需要定期运行并且可能需要访问 NGINX 变量的情况下很有用。 内容处理程序接收会话对象作为参数并且还可以访问全局对象。
默认情况下,内容处理程序在工作进程 0 上运行,但可以配置为在特定或所有工作进程上运行。
此指令在位置
上下文中可用:
example.conf:
location @periodics {
# 在工作进程 1 和 3 中以 15 分钟为间隔运行
js_periodic main.handler interval=900s worker_affinity=0101;
resolver 10.0.0.1;
js_fetch_trusted_certificate /path/to/certificate.pem;
}
example.js:
async function handler(s) {
let reply = await ngx.fetch('https://nginx.org/en/docs/njs/');
let body = await reply.text();
ngx.log(ngx.INFO, body);
}
有关语法和配置详细信息,请参阅NGINX JavaScript 文档。
在 NGINX 配置包含大量“位置”的情况下,NGINX 启动时间可能会花费相当长的时间。 在许多情况下,这可能是不可接受的。 根本问题存在于用于对位置列表进行排序的排序算法中。
NGINX R31 引入了一项增强功能,将现有的排序算法从时间复杂度为O(n2)
的插入排序替换为时间复杂度为O(n*log n)
的合并排序。
在具有 20,000 个位置的测试配置中,观察到此次更新后总启动时间从 8 秒减少到 0.9 秒。
NGINX Plus R31 对 QUIC+HTTP/3 实现进行了多项增强和性能优化,例如:
其他性能优化包括减少发送确认数据包时的潜在延迟、将确认(ACK)帧放在队列的前面以减少帧重传和 ACK 帧传送的延迟,以及改进通用分段卸载(GSO)模式下的拥塞控制行为。
管理
模块在 NGINX Plus R31 中, ngx_mgmt_module
使您能够将 NGINX 使用信息报告给 NGINX 实例管理器。 此信息包括 NGINX 主机名、NGINX 版本和唯一实例标识符。
该模块提供了几个指令来微调 NGINX 实例与 NGINX 实例管理器的通信方式。 有关可用指令和配置选项的完整列表,请参阅NGINX 文档。
NGINX Plus R29 引入了消息队列遥测传输 (MQTT) 支持,此版本包含针对 MQTT 模块中发现的问题的一些错误修复。
一个重要的修复解决了未提供密码时 CONNECT 消息被拒绝的问题。 以前,我们无条件地期望用户名字段后面跟着密码。 但是,MQTT 规范中也存在特殊情况 - 例如匿名身份验证 - 其中提供密码不是强制性的。 该修复程序通过查看数据包的cflags
字段有条件地检查是否需要密码。 如果未设置标志,则表示密码不是强制性的。
另一个错误修复是当消息长度小于接收的字节数时停止解析 MQTT CONNECT 消息。
server_tokens
支持变量NGINX Plus R31 增加了对 HTTP/3 连接缺少的server_tokens
变量的支持。 字符串
字段可用于明确设置错误页面上的签名和“服务器”响应头字段值。 如果字符串字段为空,则会禁用“服务器”字段的发射。
NGINX Plus R31 基于 NGINX Open Source 1.25.3,继承了自 NGINX Plus R30 发布以来(在 NGINX 1.25.2 和 1.25.3 中)的功能变化、特性和错误修复。
TLS_AES_128_CCM_SHA256
密码套件- 此增强功能为 QUIC 添加了TLS_AES_128_CCM_SHA256
支持,它目前是 NGINX QUIC 实现不支持的唯一密码套件。 它在 OpenSSL 中默认是禁用的,可以使用此指令启用: ssl_conf_command Ciphersuites TLS_AES_128_CCM_SHA256;
nginx
appName - 使用OPENSSL_init_ssl()
接口时,NGINX 现在会测试OPENSSL_INIT_LOAD_CONFIG
是否已定义且为真,而不是检查OPENSSL_VERSION_NUMBER
。 这确保了该接口不与 BoringSSL 和 LibreSSL 一起使用,因为它们不提供额外的库初始化设置(特别是OPENSSL_INIT_set_config_appname()
调用)。O(n*log n)
。 这会创造更好的 NGINX 启动体验,尤其是当配置中的“位置”数量非常多时。http2_max_concurrent_streams
配置。 即使从未达到允许的并发流的最大阈值,它也会应用于解释在发送请求后立即重置流的情况。client_header_buffer_size
指令指定的没有状态保留的缓冲区中。 这导致了在保存状态时缓冲区可能被覆盖的问题。 当前修复允许仅读取可用的缓冲区大小,而不是固定的缓冲区大小。 该错误首次出现在 NGINX 主线版本 1.25.1(NGINX Plus R30)中。状态: 404
按照通用网关接口 (CGI) 规范有效,但在解析过程中丢失了尾随空格。 这导致响应中出现HTTP/1.1 404
状态行,由于缺少尾随空格,违反了 HTTP 规范。 修复此错误后,此类短状态标头行中仅使用状态代码,因此 NGINX 将使用空格和适当的原因短语(如果可用)生成状态行本身。有关从最新版本继承的新更改、功能、错误修复和解决方法的完整列表,请参阅 NGINX CHANGES文件。
NGINX Plus R31 吸收了 NGINX JavaScript (njs) 模块版本 0.8.2 的变化。 以下是自 0.8.0(NGINX Plus R30 版本的一部分)以来 njs 中显著变化的列表。
error()
、 info()
、 log()
、 time()
、 timeEnd()
和warn()
。http
和stream
的js_periodic
指令,允许指定以固定间隔运行的 JS 处理程序。items()
方法。 该方法返回所有未过期的键值对。existSync()
方法。parse()
方法中损坏的 XML 异常处理。RegExp.prototype.exec()
。size()
和keys()
方法。r.internalRedirect()
中的错误异常。Object.getOwnPropertyNames()
中键的错误顺序。items()
方法。有关所有功能、更改和错误修复的完整列表,请参阅 njs更改日志。
如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到 NGINX Plus R31。 除了所有出色的新功能之外,您还将获得一些额外的修复和改进,并且保持更新将有助于 NGINX 帮助您提出支持单。
如果您还没有尝试过 NGINX Plus,我们鼓励您尝试一下。 您可以将其用于安全、负载平衡和 API 网关用例,或将其用作具有增强的监控和管理 API 的完全支持的 Web 服务器。 立即开始30 天免费试用。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”