博客 | NGINX

宣布推出 NGINX Plus R28

NGINX-F5-horiz-black-type-RGB 的一部分
罗伯特·海恩斯缩略图
罗伯特·海恩斯
2022 年 11 月 29 日发布

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

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

  • 额外的 TLS 指标- NGINX Plus R28在系统范围、客户端和服务器端级别收集额外的 TLS 统计信息,提供在排除代理配置中的 SSL/TLS 相关错误以及与客户端和上游服务器的连接时至关重要的洞察力。

    NGINX Plus 实时活动监控仪表板已更新以显示新的 SSL 会话数据。

  • 支持云私有服务中的 PROXY 协议 v2 TLV - 当您通过 AWS、Google Cloud Platform 和 Microsoft Azure 中的“私有服务”向外部客户端提供资源时,默认情况下,PROXY 协议 v2 标头中的类型长度值(TLV) 向量中表示的服务特定客户端标识符不会传递给后端服务。 NGINX Plus R28引入了用于http流上下文的模块,这些模块可以解码 TLV 并定义一个变量,用于将客户端标识符转发到后端服务。
  • 粘性 cookie samesite参数的变量支持- 在NGINX Plus R28中,粘性cookie指令的samesite参数的值可以是变量。 这一改进使得交通管理更加容易且更加安全。

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

行为方面的重要变化

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

平台支持变更

支持的新操作系统和体系结构:

  • AlmaLinux 8和9 (x86_64,aarch64)
  • Alpine 3.17(x86_64,arm64)
  • Oracle Linux 9(x86_64)
  • Rocky Linux 8 和 9 (x86_64、aarch64)

已删除旧操作系统:

  • Debian 10 将于 2022 年 8 月终止使用 (EOL)

较旧的操作系统和体系结构已弃用并计划在NGINX Plus R29中删除:

  • Alpine 3.13,于2022 年 11 月 1 日达到 EOL

处理具有相同名称的多个标头的变化

  • 大多数已知的重复上游响应标头现在都会被忽略并发出警告
  • 现在,重复的Content-LengthTransfer-Encoding标头以及具有无效Content-LengthTransfer-Encoding标头的响应会被拒绝,或者如果响应中同时存在Content-LengthTransfer-Encoding

新功能详情

其他 TLS 指标

在解决代理配置、上游服务器和客户端的 TLS 相关问题时,SSL/TLS 事件和错误的可观察性非常重要。 自NGINX Plus R13中引入NGINX Plus API以来,NGINX Plus 已在系统范围级别收集了三个 TLS 指标:

  • 握手– 成功的 SSL 握手次数
  • handshakes_failed – SSL 握手失败的次数(不包括 SSL 握手后发生的证书验证失败)
  • session_reuses – SSL 会话重用次数

NGINX Plus R27<.htmla>及更高版本中,您可以配置单个上游服务器和虚拟服务器的三个指标的收集。

NGINX Plus R28扩展了 TLS 指标集,在 HTTP 和 Stream 模块中添加了握手错误和证书验证失败的新计数器(这里我们仅提供 HTTP 模块的示例,但可用的 Stream 指标是类似的)。 有关为各个上游服务器和虚拟服务器配置指标收集的详细信息,请参阅NGINX Plus R27<.htmlspan> 公告博客

握手错误

NGINX Plus R28中新增了以下握手错误的计数器:

  • handshake_timeout – 由于握手超时导致的握手失败次数
  • no_common_cipher – 由于握手双方缺乏通用密码而导致的握手失败次数(由于不适用,因此不收集与上游服务器的连接)
  • no_common_protocol – 由于双方缺乏通用协议而导致的握手失败次数
  • peer_rejected_cert – 由于另一方拒绝 NGINX Plus 提供的证书并提供适当的警报消息而导致的握手失败次数

证书验证失败

当您配置证书验证时,现在会在 API 输出的新verify_failures部分中报告证书验证失败:

当发生证书验证失败时,相应原因的度量会增加,并且连接会断开。 但是请注意,基本握手计数器仍然会增加,因为这些失败发生在握手成功之后。

证书验证失败的指标包括:

  • expired_cert – 对等方提供了过期的证书
  • hostname_mismatch – 服务器的证书与主机名不匹配(未收集与客户端的连接)
  • no_cert – 客户端未按要求提供证书(未收集与上游服务器的连接)
  • revoked_cert – 对等方提供了已撤销的证书
  • 其他– 其他证书验证失败的明确计数器

示例指标输出

以下是系统级别 HTTP 连接的一组示例 TLS 指标:

$ curl 127.0.0.1:8080/api/8/ssl { “握手”: 32,“session_reuses”: 0,“握手失败”: 8,“无公共协议”: 4,“无通用密码”: 2,“handshake_timeout”: 0,“peer_rejected_cert”: 0,"verify_failures": {"no_cert": 0,“过期证书”: 2,“revoked_cert”: 1,“主机名不匹配”: 2、“其他”: 1 } }

以下是客户端和 HTTP虚拟服务器s9之间的连接的一组示例指标(如前所述,不会收集此类连接的hostname_mismatch计数器):

$ curl 127.0.0.1:8080/api/8/http/server_zones/s9 {...“ssl”:{“握手”: 0,“session_reuses”: 0,“握手失败”: 1,“无公共协议”: 0,“无通用密码”: 1,“握手超时”: 0,“peer_rejected_cert”: 0,"verify_failures": {"no_cert": 0,“过期证书”: 0,“撤销证书”: 0,“其他”: 0 } } ... }

以下是与u2上游组中的服务器的 HTTP 连接的一组示例指标(如前所述,不会收集此类连接的no_certno_common_cipher计数器):

$ curl 127.0.0.1:8080/api/8/http/upstreams/u2 { “peers”:[{ “id”: 0,“服务器”: “127.0.0.1:8082”, “名称”: “127.0.0.1:8082”,...“ssl”:{“握手”: 1、“session_reuses”: 0,“握手失败”: 0,“无通用协议”: 0,“握手超时”: 0,“peer_rejected_cert”: 0,"verify_failures": {"expired_cert": 1,“revoked_cert”: 0,“主机名不匹配”: 0,“其他”: 0 } }, ... } ], }

NGINX Plus 仪表板显示扩展 TLS 指标

对于NGINX Plus R28及更高版本,实时活动监控仪表板显示上面描述的新 TLS 指标。 此屏幕截图显示了与客户端的连接指标。 要查看新指标,请将鼠标悬停在SSL > 握手失败列中的值上,如下所示。

Cloud Private Services 中对 PROXY 协议 v2 TLV 的支持

三大领先的云提供商——亚马逊网络服务 (AWS)、谷歌云平台 (GCP) 和微软 Azure——均提供“私人服务”,您可以让外部客户端访问您的服务,而无需将其暴露在公共互联网上。 每个服务都使用一个客户端标识符,该标识符以 PROXY 协议 v2 标头中的类型长度值 (TLV)向量表示。 特定于服务的标识符为:

默认情况下,这些客户端标识符不会传递给后端服务。 NGINX Plus R28引入了用于http上下文的模块 - ngx_http_proxy_protocol_vendor_modulengx_stream_proxy_protocol_vendor_module - 它们解码 TLV 并定义一个变量以将标识符转发到后端服务。

有关 NGINX Plus 如何使用 PROXY 协议获取 IP 地址和有关客户端的其他信息的一般信息,请参阅 NGINX Plus 管理指南中的接受 PROXY 协议

AWS 的 PROXY 协议 v2 支持

在 AWS 中,通过虚拟私有云 (VPC) 端点服务来自客户端的流量的源 IP 地址是网络负载均衡器节点的私有 IP 地址。 如果后端应用需要客户端的真实 IP 地址和其他标识符,则可以从 PROXY 协议 v2 标头中获取。

在 AWS 中,自定义 TLV 向量在 PROXY 协议 v2 标头PP2_SUBTYPE_AWS_VPCE_ID中对端点的 VPC ID 进行编码。 (有关更多信息,请参阅AWS 文档。)

场地 长度(八位字节) 描述
类型 1 PP2_TYPE_AWS ( 0xEA )
长度 2 值的长度
价值 1 PP2_SUBTYPE_AWS_VPCE_ID ( 0x01 )
变化(值长度减 1) 端点的ID

NGINX Plus R28解码 TLV 并将端点 ID 传递给$proxy_protocol_tlv_aws_vpce_id变量中的后端应用。

笔记: 在引用$proxy_protocol_tlv_aws_vpce_id变量的服务器块中,您还必须将proxy_protocol参数包含在listen [ HTTP ][ Stream ] 指令中。 有关示例,请参见下面的proxy_protocol_v2.conf的第 8 行。

此 AWS 示例配置检查 VPC ID 是否可接受,如果可以,则将其作为add_header指令的第二个参数传递给后端应用:

GCP 的 PROXY 协议 v2 支持

在 GCP Private Service Connect 中,来自客户端的流量的源 IP 地址是“服务生产商的 VPC 网络中的 Private Service Connect 子网之一中的地址”。 如果后端应用需要客户端的真实 IP 地址和其他标识符,则可以从 PROXY 协议 v2 标头中获取。

在 GCP 中,自定义 TLV 向量在 PROXY 协议 v2 标头pscConnectionId中对唯一(当时)连接 ID 进行编码。 (有关更多信息,请参阅GCP 文档。)

场地 长度(字节) 描述
类型 1 0xE0PP2_TYPE_GCP
长度 2 0x8 (8 字节)
价值 8 按网络顺序排列的 8 字节pscConnectionId

NGINX Plus R28解码 TLV 并将pscConnectionId的值传递给$proxy_protocol_tlv_gcp_conn_id变量中的后端应用。

笔记: 在引用$proxy_protocol_tlv_gcp_conn_id变量的服务器块中,还必须将proxy_protocol参数包含在listen [ HTTP ][ Stream ] 指令中。 有关示例,请参见上面的proxy_protocol_v2.conf的第 8 行。

Microsoft Azure 的 PROXY 协议 v2 支持

在 Microsoft Azure Private Link 中,来自客户端的流量的源 IP 地址是“服务提供商端使用从提供商虚拟网络分配的 NAT IP [地址] 进行的网络地址转换 (NAT)”。 如果后端应用需要客户端的真实 IP 地址和其他标识符,则可以从 PROXY 协议 v2 标头中获取。

在 Azure 中,自定义 TLV 向量在 PROXY 协议 v2 标头PP2_SUBTYPE_AZURE_PRIVATEENDPOINT_LINKID中对客户端的 LinkID 进行编码。 (有关更多信息,请参阅Azure 文档。)

场地 长度(八位字节) 描述
类型 1 PP2_TYPE_AZURE ( 0xEE )
长度 2 值的长度
价值 1 PP2_SUBTYPE_AZURE_PRIVATEENDPOINT_LINKID ( 0x01 )
4 UINT32(4 个字节)表示私有端点的LINKID 。 以小端格式编码。

NGINX Plus R28解码 TLV 并将 LinkID 传递给$proxy_protocol_tlv_azure_pel_id变量中的后端应用。

笔记: 在引用$proxy_protocol_tlv_azure_pel_id变量的服务器块中,还必须将proxy_protocol参数包含在listen [ HTTP ][ Stream ] 指令中。 有关示例,请参见上面的proxy_protocol_v2.conf的第 8 行。

粘性 Cookie samesite参数的变量支持

在之前的 NGINX Plus 版本中,粘性cookie指令的samesite参数有三个静态值( strictlaxnone )是可接受的。 在NGINX Plus R28中,该值也可以是变量。

默认情况下(没有samesite参数),NGINX 不会将SameSite属性注入到 cookie 中。 当samesite参数是变量时,结果取决于变量在运行时如何解析:

  • 设置为标准值之一( strictlaxnone ) – NGINX 将SameSite属性设置为该值
  • 为空值 ( “” ) – NGINX 不会注入SameSite属性
  • 任何其他值都表示配置错误 - NGINX 注入设置为Strict (最安全的设置)的 SameSite属性

此示例配置根据 HTTP User-Agent标头的值设置samesite属性(这对于不支持SameSite属性的旧客户端很有用):

 

NGINX Plus R28 中的其他增强功能

从 NGINX 开源版本继承的变更

NGINX Plus R28基于 NGINX Open Source 1.23.2,并继承了自NGINX Plus R27发布以来(NGINX 1.23.0 至 1.23.2)的功能更改和错误修复。 变更和错误修复包括:

  • HTTP解析器指令的新ipv4=off参数禁用 IPv4 地址的查找。
  • 当您使用ssl_session_cache指令的共享参数为 HTTP 会话信息启用共享缓存时,TLS 会话票证密钥现在会自动轮换。
  • 记录的几种 TLS/SSL 错误的严重性级别从crit降低到info

有关从这些版本继承的新功能、更改和错误修复的完整列表,请参阅CHANGES文件。

NGINX JavaScript 模块的变更

NGINX Plus R28吸收了 NGINX JavaScript 模块(njs)0.7.5 至 0.7.8 版本中的更改和修复。 我们在博客中使用 njs 0.7.7 让您的 NGINX 配置更加模块化和可重用中重点介绍了其中的一些最重要的内容。 有关完整列表,请参阅变更文件。

升级或尝试 NGINX Plus

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

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


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