博客 | NGINX

宣布推出 NGINX Plus R21

NGINX-F5-horiz-black-type-RGB 的一部分
Liam Crilly 缩略图
利亚姆·克里利
2020 年 4 月 7 日发布

我们很高兴地宣布NGINX Plus Release 21 (R21)现已推出。 NGINX Plus 基于 NGINX 开源,是唯一负载均衡器、内容缓存、Web 服务器和 API 网关于一体的套件。 超过4.5 亿个网站依赖 NGINXNGINX Plus R21比以往更加可靠和安全,主要专注于 NGINX 开源的错误修复和稳定性改进

NGINX Plus R21的新功能包括:

  • 动态 gRPC 代理– 在将 gRPC 连接传递给后端 gRPC 服务时,我们添加了变量支持。 这使您能够根据客户端属性动态地将 gRPC 连接路由到服务组。
  • NGINX JavaScript 模块增强功能- NGINX JavaScript 模块 (njs) 已更新至 0.3.9 版,修复了几个错误并增强了与子请求和文件系统支持相关的其他功能。

行为方面的重要变化

  • 可接受的请求- 根据RFC 7230 ,NGINX Plus 不再允许具有多个Host标头的客户端请求。
  • 支持新的操作系统- Alpine Linux 3.11。
  • 不再支持旧操作系统- 32 位平台(i386 架构)。

投资质量

高效的软件和代码质量是我们构建 NGINX(开源和 NGINX Plus)的核心原则。

NGINX 团队采用了所有商业软件所具备的现代 CI/CD 和自动化测试工具。 每日检测 活跃开发分支的“缺陷密度”非常低,每 1000 行代码仅有 0.01 个缺陷,而类似大小的代码库的平均密度为每 1000 行 0.7 个缺陷。

我们还委托外部和独立的渗透测试和代码审查来审查开源和 NGINX Plus 组件。 最新的渗透测试和代码审查发现了几个问题,并在此版本中进行了解决。

问题修复

总的来说, NGINX Plus R21修复了 14 个错误:

  • 使用 HTTP/2 时发生套接字泄漏(两个独立的错误)
  • njs模块和aio指令中使用子请求时发生套接字泄漏
  • WebDav模块中潜在的内存耗尽
  • MP4模块中的潜在内存泄露
  • 状态代码494被退回,而不是400当代码出现错误时494使用error_page指令进行重定向
  • 处理 SSL 连接中的流水线请求时可能会发生超时
  • 如果使用OCSP 装订,工作进程中可能会发生分段错误
  • 如果配置中包含带有空替换字符串的重写指令,则在启动或重新配置期间可能会发生分段错误
  • 如果break指令与alias指令一起使用,或者与带有 URI 的proxy_pass指令一起使用,则工作进程中可能会发生分段错误
  • 仅处理了第一个Transfer-Encoding请求标头
  • 如果请求 URI 被重写为包含空字符的 URI,则Location响应标头行可能包含垃圾信息
  • 使用error_page指令返回重定向时,带有正文的请求被错误处理
  • 使用 HTTP/2 时debug_points指令中的错误

请注意,这些错误都不是严重的,并且没有相关的 CVE 记录。

投资 NGINX Plus 路线图

在发布此版本时,我们正在努力制定 2020 年路线图。 今年晚些时候,我们预计将推出HTTP/3 (又名 QUIC)的生产级实现。 如果您有兴趣关注或测试这项技术,请留意未来几周的实验补丁。

新功能详情

动态 gRPC 代理

NGINX Plus R15引入了对将 gRPC 流量路由和负载均衡到上游组的支持。 您可以通过包含grpc_pass指令来利用 NGINX Plus 来路由 gRPC 流量。

NGINX Plus R21grpc_pass指令中引入了变量支持,以提供扩展到 gRPC 工作负载的动态、API 驱动的路由策略。 这使得满足以下用例成为可能:

  • A/B 测试——在多个上游统计地分配 gRRC 请求,以确定哪一个表现更好。
  • 调试路由- 将流量路由到生产 gRPC 服务,但将具有特定属性(源 IP 地址、gRPC 元数据)的请求路由到调试 gRPC 服务。

以下配置是调试路由的示例实现。

在第 1 行中,我们定义了一个可以使用网络范围作为键的键值存储(由type=ip参数启用)。 第 2 行指定通过在grpc-greeter键值存储中执行查找来评估$greeter_upstream变量,使用客户端 IP 地址( $remote_addr )作为键。

在第 10 行,我们指定grpc://$greeter_upstream作为grpc_pass指令的参数,用于基于客户端的 IP 子网的 TLS 终止和 gRPC 请求的动态路由。

例如,您可以在 NGINX Plus 实例上运行以下命令,将来自 192.168.80.0/24 子网的请求路由到grpc-servers-greeter-debug

$ curl -iX POST -d '{"192.168.80.0/24":"grpc-servers-greeter-debug"}' http://localhost:8080/api/6/http/keyvals/grpc-greeter

要将 gRPC 流量切换到生产服务组( grpc-servers-greeter-prod ),请运行以下命令:

$ curl -iX PATCH -d '{"192.168.80.0/24":"grpc-servers-greeter-prod"}' https://localhost:8080/api/6/http/keyvals/grpc-greeter

NGINX JavaScript 模块的增强功能

NGINX JavaScript 模块 (njs) 已更新至0.3.9 版本,修复了几个错误并增强了一些与子请求和文件系统支持相关的功能。

子请求

r.subrequest函数使 njs 代码能够向任何 URI 发出异步 HTTP 请求。这有许多可能的用例,一个值得注意的例子是对外部身份验证服务器的 API 调用,例如OAuth 2.0 令牌自检。 此版本为子请求带来了两个重要的增强功能:承诺和分离子请求。

[编辑器– 以下两个示例用例只是 NGINX JavaScript 模块的众多用例中的一部分。 有关完整列表,请参阅NGINX JavaScript 模块的用例 ]

承诺

子请求通常包括处理子请求响应的回调函数。 现在可以省略回调函数,使用 JavaScript 承诺作为与调用代码内联处理响应的方式。 下面的示例说明了如何在不使用回调的情况下将连续的子请求在单个代码序列中链接在一起。

分离子请求

子请求是异步的,以前必须从js_content指令调用它们。 现在,子请求也可以在变量评估期间从js_set指令触发。 这些“分离的”子请求仍然异步工作,但不会向调用函数返回任何数据,并且任何响应都会被忽略。

如果交换的数据总量超过 1 MB,以下示例代码将使用分离子请求将请求标头的副本发送到安全信息和事件管理 ( SIEM ) 系统。

[编辑器– 以下配置已更新为使用js_import指令,该指令取代了NGINX Plus R23<.htmla> 中的js_include指令。 有关详细信息,请参阅 NGINX JavaScript 模块 - 这 示例配置 部分显示了 NGINX 配置和 JavaScript 文件的正确语法。]

然后,当我们写入访问日志时,通过要求变量评估在日志阶段执行 JavaScript 代码。

文件系统

JavaScript 文件系统对象fs已得到增强,以支持异步操作的承诺。 此外,还有新的文件系统方法: access()realpath()symlink()unlink()

升级或尝试 NGINX Plus

如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到NGINX Plus R21 。 您还将获得许多额外的修复和改进,当您需要提出支持单时,它将帮助 NGINX 为您提供帮助。

在继续升级之前,请仔细查看本博客文章中描述的新功能行为变化

如果您还没有尝试过 NGINX Plus,我们鼓励您尝试一下 – 为了安全、负载均衡和 API 网关,或者作为具有增强监控和管理 API 的完全支持的 Web 服务器。 您今天就可以开始享受30 天免费试用。 亲自了解 NGINX Plus 如何帮助您交付和扩展您的应用。


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