博客 | NGINX

宣布推出 NGINX Plus R30

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

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

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

  • 对 QUIC+HTTP/3 的原生支持 NGINX Plus 现已正式支持 HTTP/3。 该实现不依赖第三方库来提供通过 QUIC 协议提供 HTTP/3 支持所需的缺失的 OpenSSL TLS 功能。 它使用 NGINX 团队开发的 OpenSSL 兼容层来规避 OpenSSL 不支持的 QUIC TLS 接口带来的挑战。
  • 每个工作者连接遥测-现在支持在每个工作者级别监控连接。 这使得用户能够通过调节工作进程的数量并在工作进程之间有效地分配连接来微调 NGINX 性能,以获得最佳性能。
  • 诊断包 NGINX 诊断包将解决问题所需的所有数据收集到一个压缩文件中。 这改善了 NGINX Plus 用户和 F5 支持之间的沟通,提高了效率并减少了问题解决的周转时间。

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

行为方面的重要变化

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

弃用listen … http2指令

listen ... http2指令已在 NGINX 1.25.1 中弃用。 使用nginx -t检查 NGINX 配置会给出相关警告。  

nginx -t

nginx:[警告] “listen ... http2”指令已弃用,请在 etc/nginx/nginx.conf 中使用“http2”指令代替:15

nginx:配置文件 /etc/nginx/nginx.conf 语法正确

nginx:配置文件 /etc/nginx/nginx.conf 测试成功

强烈建议该指令的所有现有用户升级 NGINX 并使用 http2 指令,该指令在每个服务器上启用 HTTP/2。

改变这个:

监听443 ssl http2;

对此:

监听 443 ssl;
http2 开启;

Amazon Linux 2 上 GeoIP2 模块不可用

NGINX Plus 的早期版本使用来自 Amazon Linux 2 EPEL 存储库的“libmaxminddb”库来构建GeoIP2 模块。 EPEL 存储库不再提供此库,也无法从 Amazon Linux 2 发行版本地访问它。 因此,该模块在 NGINX Plus R30 中不再可用,因为没有可行的方法为 Amazon Linux 2 构建它。

MQTT 指令的变更

mqtt_rewrite_buffer_size指令用于指定构建 MQTT 消息的缓冲区大小,已被mqtt_buffers指令取代。 新的指令允许指定每个连接可分配的缓冲区数量,以及指定每个缓冲区的大小。

更新 API 版本

NGINX Plus API 的版本号已从 8 更新为 9,以反映每个工作器连接遥测中描述的每个工作器指标的增加。 以前的版本号仍然有效,但输出不包含在后续 API 版本中添加的指标。

平台支持变更

支持的新操作系统:

  • Debian 12
  • Alpine 3.18

已删除旧操作系统:

  • Alpine 3.14,于 2023 年 5 月 1 日终止使用 (EOL)
  • Ubuntu 18.04,将于 2023 年 4 月 26 日达到 EOL

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

  • Alpine 3.15 将于 2023 年 11 月达到 EOL

新功能详情

原生支持 QUIC+HTTP/3

QUIC 上的 HTTP/3 一直是我们许多企业客户所要求的备受期待的功能,我们很高兴在 NGINX Plus R30 中正式引入它。 这是一项新技术和新实现,我们将在未来的版本中继续关注它。 我们建议 NGINX Plus 用户首先在非生产环境中尝试它,并与我们分享任何宝贵的反馈。

NGINX Plus 依靠 OpenSSL 实现安全通信和加密功能,利用操作系统附带的 SSL/TLS 库。 但是,由于 QUIC 的 TLS 接口在此版本中不受 OpenSSL 支持,因此需要第三方库来提供 HTTP/3 所需的缺失的 TLS 功能。

为了解决这一问题,NGINX 团队开发了OpenSSL 兼容层,从而无需构建和运送第三方 TLS 库(如 quictls、BoringSSL 和 LibreSSL)。 这有助于管理 NGINX 中的端到端 QUIC+HTTP/3 体验,而无需自定义 TLS 实现的负担,也无需依赖第三方库的计划和路线图。 我们计划在未来的版本中增强 OpenSSL 兼容层,提供更多功能和选项,例如对 0-RTT 的支持。

以下是 QUIC+HTTP/3 配置:
   

http {
        log_format quic '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" "$http3"';
         access_log logs/access.log quic;

         server {
             # 为了更好的兼容性,建议
             # 对 quic 和 https 使用相同的端口
            listen 8443 quic repeatport;
            listen 8443 ssl;

             ssl_certificate     certs/example.com.crt;
             ssl_certificate_key certs/example.com.key;

             location / {
                 # 浏览器需要将其引导至 quic 端口
                 add_header Alt-Svc 'h3=":8443"; ma=86400';
             }
         }
    }

NGINX Plus R30 中的 QUIC+HTTP/3 支持作为单个二进制文件提供 - 与NGINX Plus R29 中引入的实验性 HTTP/3 支持不同,后者为 nginx quic 提供了单独的二进制文件。 这一改进使得在您的环境中部署功能变得更加容易。

笔记: 从 NGINX Plus R30 开始,我们将终止对独立 QUIC 二进制文件的支持和更新,并计划在今年晚些时候将其从下载选项中删除。

每个 Worker 的连接遥测

NGINX Plus 用户现在可以监控每个工作进程的总连接数,以充分调整worker_connections指令。 这一改进使用户能够更好地了解连接在工作人员之间的分配情况。 能够调整工作连接也可以帮助您更好地评估 NGINX 部署。

每个工作器的连接指标可通过 REST API 获取。要检索每个工作器的连接指标,请使用…/api/9/workers端点。

要检索单个工作者的每个工作者连接指标,请使用.../api/9/workers/< worker id >端点。 工人 ID有一个基于 0 的索引。

以下是一个示例响应:

{
      {
          “ID”: 0,
        “pid”: 2346,
        “连接”: {
            “已接受”: 1,
            “掉线”: 0,
            “活跃”: 1、
             “空闲”: 0
        },
        “http”:{
            “请求”:{
                “总计”: 15,
                 “当前”: 1
             }
        }
    },
    {
        “id”: 1,
        “pid”: 1234,
        “连接”: {
            “接受”: 3,
            “已删除”: 0,
            “活跃”: 1、
             “空闲”: 0
        },
        “http”:{
            “请求”:{
                “总计”: 15,
                 “当前”: 1
              }
          }
      },

      ...

  }

每个工作者连接指标可在NGINX Plus 实时活动监控仪表板中查看,如下所示。 请前往 demo.nginx.com 访问此功能的实际演示。

NGINX Plus 实时活动监控仪表板显示以下有关 NGINX Plus 连接和请求的信息

仪表板显示有关 NGINX Plus 连接和请求的以下信息。

连接:

  • 每个 worker 接受的连接数
  • 每个 worker 的活跃连接数
  • 每个 worker 的空闲连接数
  • 每个 worker 断开的连接数

要求:

  • 每个 worker 的当前请求数
  • 每个 worker 的请求总数
  • 每个工作者每秒的请求数

诊断包

为了减少问题解决的时间,诊断包简化了收集解决 NGINX 环境中的问题所需数据的过程。 诊断包还可以帮助避免与手动请求和收集解决问题所需信息相关的差异和延迟,从而使NGINX Plus 客户和 F5 支持之间的互动更加高效。

诊断包收集:

  • NGINX 信息– NGINX Plus 版本、配置、进程信息、第三方模块、日志以及 API 统计信息和端点
  • 系统信息– 主机命令( pslsofvmstat等)
  • 服务信息systemd等。
  • NGINX 代理– 日志和配置(如果存在)
  • NGINX App Protect – 日志和配置(如果存在)
  • 支持包日志– 包含收集的所有文件列表的日志

我们添加诊断包的目标是让用户透明地了解包中的脚本运行了哪些命令以及收集了哪些数据。 有关更多信息,请参阅NGINX Plus 诊断包页面。

笔记: 诊断包的可用性是作为当前 NGINX Plus R30 版本的一部分宣布的,但诊断包实际上并不依赖于版本。 展望未来,我们计划根据您和 F5 支持部门的反馈对其进行更新,以改进故障排除数据收集流程。

NGINX Plus R30 中的其他增强功能

MQTT 优化

通过对消息队列遥测传输 (MQTT) 过滤器模块的内存消耗进行改进,现在吞吐量增加了 4-5 倍。

指令mqtt_rewrite_buffer_size已被删除。 相反,新指令 mqtt_buffers <数量> <大小> 引入该参数是为了指定模块每个连接可以分配多少个缓冲区,以及每个缓冲区的大小。 缓冲区的默认数量为 100,每个缓冲区的默认大小为 1024 字节,这使得变量mqtt_buffers 的默认值为 <100> <1024>

DNS 重新加载优化

NGINX Plus 现在会在重新加载时保留动态解析的上游主机的 DNS 名称过期时间,无需在重新加载配置时重新解析。 在此更新之前,所有上游都触发了 DNS 解析。 通过此更新,NGINX 保留所有上游的 DNS 解析和到期时间,并在重新加载时仅为新的或更改的上游触发 DNS 解析。

这种优化对于包含大量上游主机的 NGINX 环境影响最大。 如果您的 NGINX 配置中有 100 个或更多上游主机,则优化将最为明显。

从 NGINX 开源版本继承的变更

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

更改

  • HTTP/2 服务器推送支持已被删除。 HTTP/2 server_push 的采用率很低,只能在非常有限的用例中使用。 (根据 IETF 102 参考文档,它仅在 0.04% 的会话中使用。 根据 RFC 913,“它很难有效使用。”)HTTP/2 服务器推送在 Chrome 版本 106 中被禁用。 作为此更改的一部分, http2_pushhttp2_push_preloadhttp2_max_concurrent_pushes指令已被淘汰。
  • 已弃用的ssl指令不再受支持。 ssl指令在 NGINX 1.15.0 中已被弃用,并由 listen 指令的ssl参数取代。 弃用的 ssl 指令现已被删除。
  • 如上所述, listen…http2指令已被弃用。 建议用户改用http2指令。
    • 对于使用 OpenSSL v1.0.2h 或更高版本的 SSL 连接,如果在服务器名称标识 (SNI) 选择的虚拟服务器中启用了 HTTP/2 协议,则application层协议协商 (ALPN) 回调会自动选择该协议。
    • 对于旧版本的 OpenSSL,HTTP/2 协议是根据默认虚拟服务器配置启用的。
    • 对于普通的 TCP 连接,如果在默认虚拟服务器中启用了 HTTP/2,则现在可以通过 HTTP/2 前缀自动检测 HTTP/2。 如果前缀不匹配,则假定为 HTTP/0.9-1.1。
  • 在同一监听套接字上添加了对通过 Cleartext TCP(h2c)的 HTTP/2 和 HTTP/1.1 的支持。 在现有实现中,如果用户配置了 h2c 监听套接字(例如, listen port_num http2 ),则只能创建 HTTP/2 连接。 h2 监听套接字支持 HTTP/1.1 和 HTTP/2,并通过 ALPN 协商协议。 然而,在现有的实现中,HTTP/1.1 客户端在套接字上失败,从而阻止使用 HTTP 升级作为协商协议的手段。 此更改允许在使用 HTTP/2 时在普通 TCP 套接字上同时支持 HTTP/1.1 和 HTTP/2。
  • 启用某些$sent_http_*可以避免可能发生的缓冲区溢出。 评估多标头$sent_http_变量的逻辑存在缺陷,当某些元素被清除但仍保留在链接列表中时,会导致潜在的缓冲区溢出。 当使用第三方模块覆盖多标头值时会出现此问题。 更新版本引入了精细的边界检查,确保更安全地处理和评估这些变量。

特稿

  • 添加了完整的 HTTP/3 支持。 NGINX 1.25.0 主线版本引入了对 HTTP/3 的支持,该支持已合并到 NGINX Plus R30 中。 与 NGINX Plus R29 中提供的实验性软件包相比,NGINX Plus R30 实现有以下变化:
  •  
    • 删除了quic_mtu指令
    • 删除了listen 指令的 http3 参数
    • 从流模块中删除了 QUIC 支持
    • 删除了 HTTP/3 服务器推送
    • 修复了使用 OpenSSL 3.2+ 构建 OpenSSL 兼容层的问题

错误修复

  • 如果正则表达式(regex)研究列表分配失败,则修复段错误

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

NGINX JavaScript 模块的变更

NGINX Plus R30 吸收了 NGINX JavaScript (njs) 模块版本 0.8.0 的变化。

特稿

  • 引入全局 NGINX 属性:
    ngx.buildngx.conf_file_pathngx.error_log_pathngx.prefixngx.versionngx.version_numberngx.worker_id
  • 引入了针对httpstream 的js_shared_dict_zone指令,允许声明在工作进程之间共享的字典。
  • 添加了符合 ES13 的数组方法: Array.from()、Array.prototype.toSorted()、Array.prototype.toSpliced()、Array.prototype.toReversed()
  • 添加了符合 ES13 的 TypedArray 方法: %TypedArray%.prototype.toSorted()、%TypedArray%.prototype.toSpliced()、%TypedArray%.prototype.toReversed()
  • WebCrypto API中添加了 CryptoKey 属性。添加了以下属性: algorithm、extractable、type、usages

更改

  • 删除了Fetch API中对禁用标头的特殊处理0.7.10
  • 从 http 模块中删除了r.requestBody() ,该模块在 0.5.0 版本中已被弃用。 应该使用r.requestBufferr.requestText属性。
  • 从 http 模块中删除了r.responseBody(),该模块在 0.5.0 版本中已被弃用。 应该使用r.responseBufferr.responseText属性。
  • http模块中过滤时在r.internalRedirect()中抛出异常。
  • 本机方法配有retval参数。 此更改破坏了与 njs 的 C 扩展的兼容性,需要修改代码。
  • 不兼容的弃用 String 方法已被删除。 下列方法已被删除: String.bytesFrom()、String.prototype.fromBytes()、String.prototype.fromUTF8()、String.prototype.toBytes()、String.prototype.toUTF8()、String.prototype.toString(encoding)
  • 删除了使用 GNU readline 构建的支持。

问题修复

  • http模块中过滤时修复r.status设置器。
  • 修复了http模块中Location标头的设置。
  • 修复了сrypto.getRandomValues()的返回值。
  • 使用函数表达式修复计算属性名称的评估。
  • 修复了数组中声明的函数表达式的隐式名称。
  • 修复了 for-in 循环的解析。
  • 使用 ISO-8601 格式和 UTC 时间偏移修复了Date.parse()

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

升级或尝试 NGINX Plus

如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到 NGINX Plus R30。 除了所有出色的新功能之外,您还将获得一些额外的修复和改进,并且保持更新将有助于 NGINX 帮助您提出支持单。

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


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