NGINX.COM
Web Server Load Balancing with NGINX Plus

很高兴宣布推出 NGINX Plus Release 30 (R30) 版本。NGINX Plus 基于 NGINX 开源版构建而成,是唯一一款将软件 Web 服务器、负载均衡器、反向代理、内容缓存和 API 网关集于一身的多合一产品。

NGINX Plus R30 的新增特性包括:

  • 对 QUIC+HTTP/3 的原生支持 – NGINX Plus 现在提供对 HTTP/3 的官方支持。该实现不依赖于第三方库来提供所需的 OpenSSL TLS 功能,从而通过 QUIC 协议提供 HTTP/3 支持。它使用 NGINX 团队开发的 OpenSSL 兼容层规避 OpenSSL 不支持的 QUIC TLS 接口所带来的挑战。
  • 单位 worker 连接遥测 – 新版本现在支持建立单位 worker 级监控连接。这样,用户便可通过调节 worker 进程的数量并在 worker 之间有效分配连接来优化性能,从而微调 NGINX 性能。
  • 诊断软件包 – NGINX 诊断软件包将解决问题所需的全部数据收集到单个压缩文件中。这有助于改善 NGINX Plus 用户与 F5 支持部门之间的沟通,从而提高效率并缩短问题解决的周期。

此外,该版本还包括从 NGINX 开源版继承的新特性和漏洞修复,以及对 NGINX JavaScript 模块的更新。

 

重要行为变更

:如果您不是从 NGINX Plus R29 升级至 NGINX Plus R30,请务必查看之前的公告博客中的“重要行为变更”部分,了解当前版本和最新版本之间所有版本的嬗变过程。

弃用 listen … http2 指令

在 NGINX 1.25.1 中,listen … http2 指令已被弃用。使用 nginx -t 执行 NGINX 配置检查时,系统会发出如下警告。  

nginx -t
nginx: [warn] the "listen ... http2" directive is deprecated, use the "http2" directive instead in etc/nginx/nginx.conf :15
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

将:

listen 443 ssl http2;

改为:

listen 443 ssl;
http2 on;

GeoIP2 模块在 Amazon Linux 2 上不可用

以前版本的 NGINX Plus 使用 Amazon Linux 2 EPEL 代码库中的“libmaxminddb”库来构建 GeoIP2 模块。但 EPEL 代码库不再提供此库,而且也无法从 Amazon Linux 2 发行版原生访问此库。因此,NGINX Plus R30 中不再提供该模块,因为没有可行的方法来为 Amazon Linux 2 构建它。

MQTT 指令的变更

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

更新的 API 版本

NGINX Plus API 的版本号从 8 更新到了 9,以体现新版本添加了单位 worker 连接遥测中所述的单位 worker 指标。以前的版本号仍然有效,但输出结果不包括之后的 API 版本中添加的指标。

平台支持的变更

全新操作系统支持:

  • Debian 12
  • Alpine 3.18

不再支持的旧版操作系统:

  • Alpine 3.14,已于 2023 年 5 月 1 日停服
  • Ubuntu 18.04,已于 2023 年 4 月 26 日停服

以下旧版操作系统已弃用并计划在 NGINX Plus R31 中移除:

  • Alpine 3.15,将于 2023 年 11 月停服

 

新增特性详情

对 QUIC+HTTP/3 的原生支持

许多企业客户对基于 QUIC 的 HTTP/3 特性翘首以待,我们很高兴在 NGINX Plus R30 中正式引入这一特性。这是一项新技术和实现,我们将在未来版本中继续着重优化。我们建议 NGINX Plus 用户首先在非生产环境中进行试用,并向我们提出宝贵反馈意见。

NGINX Plus 利用操作系统自带的 SSL/TLS 库,依靠 OpenSSL 实现安全通信和加密功能。但由于在此版本中,OpenSSL 不支持 QUIC 的 TLS 接口,因此需要第三方库来提供 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 reuseport;             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 进程的总连接数,从而对 worker_connections 指令进行适当调整。这一改进可让用户更好地了解 worker 之间连接的分配情况。调整 worker 连接还有助于您更好地评估 NGINX 部署。

单位 worker 连接指标可通过 REST API 获取。若要检索单位 worker 连接指标,请使用 …/api/9/workers 端点。

若要检索各个 worker 的单位 worker 连接指标,请使用 .../api/9/workers/<worker id> 端点。worker id 的索引从 0 开始。

下面是响应示例:

{
      {
          "id": 0,
          "pid": 2346,
          "connections": {
              "accepted": 1,
              "dropped": 0,
              "active": 1,
              "idle": 0
          },
          "http": {
              "requests": {
                  "total": 15,
                  "current": 1
              }
          }
      },
      {
          "id": 1,
          "pid": 1234,
          "connections": {
              "accepted": 3,
              "dropped": 0,
              "active": 1,
              "idle": 0
          },
          "http": {
              "requests": {
                  "total": 15,
                  "current": 1
              }
          }
      },
    ...
}

NGINX Plus 实时活动监控仪表盘提供了单位 worker 连接指标,如下所示。请访问 demo.nginx.com,观看该特性的在线演示。

NGINX Plus 实时活动监控面板显示以下关于 NGINX+连接和请求的信息

该仪表盘显示了以下有关 NGINX Plus 连接数和请求数的信息。

连接:

  • 单位 worker 已接受连接数
  • 单位 worker 活动连接数
  • 单位 worker 空闲连接数
  • 单位 worker 断开连接数

请求:

  • 单位 worker 当前请求数
  • 单位 worker 总请求数
  • 单位 worker 每秒请求数

诊断软件包

为了缩短问题解决的周期,诊断软件包简化了在 NGINX 环境中解决问题所需的数据收集流程,而且还可帮助避免手动请求和收集故障排除所需信息所带来的不一致和延迟问题,从而提高 NGINX Plus 客户和 F5 支持部门之间沟通的效率。

诊断软件包收集:

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

我们添加诊断软件包的目的是让用户清楚地了解软件包中的脚本运行哪些命令以及正在收集哪些数据。请参阅 NGINX Plus 诊断软件包页面(链接即将发布,您可点击此处下载脚本。)

注:在当前 NGINX Plus R30 版本中,我们宣布新增诊断软件包,但该软件包实际上不受版本限制。未来,我们计划根据您和 F5 支持部门的反馈意见对其进行更新,以改进故障排除数据收集流程。

 

NGINX Plus R30 的其他增强特性

MQTT 优化

通过对消息队列遥测传输(MQTT)filter 模块进行内存消耗方面的改进,吞吐量现在提高了 4-5 倍。

mqtt_rewrite_buffer_size 指令已删除。取而代之的是新的 mqtt_buffers <num> <size> 指令的引入,以指定该模块可为每个连接分配的缓冲区数量,以及每个缓冲区的大小。缓冲区的默认数量为 100 个,每个缓冲区的默认大小为 1024 字节,因此变量的默认值为 mqtt_buffers <100> <1024>

DNS 重新加载优化

现在,对于重新加载时动态解析的上游主机,NGINX Plus 能够保留其 DNS 域名有效期,无需在重新加载配置时进行重新解析。在此更新之前,所有上游主机都会触发 DNS 解析。更新后,NGINX 会保留所有上游主机的 DNS 解析和有效期,在重新加载时仅对全新或变更的上游主机触发 DNS 解析。

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

从 NGINX 开源版继承的变更

NGINX Plus R30 基于 NGINX 开源版 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 协议,则应用层协议协商(ALPN)回调会自动选择该协议。
    • 对于旧版 OpenSSL,HTTP/2 协议基于默认虚拟服务器配置而被启用。
    • 就普通 TCP 连接而言,如果在默认虚拟服务器上启用了 HTTP/2,HTTP/2 前言就会自动检测到该协议。如果前言不匹配,则假定使用 HTTP/0.9-1.1。
  • 增添了在同一监听套接字上对 HTTP/2 over Cleartext TCP (h2c) 和 HTTP/1.1 的支持。在现有实现中,如果用户配置了 h2c 监听套接字(例如 listen port_num http2),则仅可创建 HTTP/2 连接。h2 监听套接字支持 HTTP/1.1 和 HTTP/2,并通过 ALPN 协商协议。但在现有实现中,HTTP/1.1 客户端会因套接字错误而无法使用 HTTP Upgrade 来协商协议。此变更允许在使用 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 指令
    • 取消了 http3 parameter of listen 指令
    • 从 stream 模块中移除了 QUIC 支持
    • 删除了 HTTP/3 服务器推送
    • 修复了使用 OpenSSL 3.2+ 构建 OpenSSL 兼容层的问题

漏洞修复

  • 修复了正则表达式(regex)研究列表分配失败时出现的 segfault 问题。

有关从最新版本继承的新变更、特性、漏洞修复及变通方案的完整列表,请参见 NGINX 变更文件。

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 指令 — 允许声明 worker 进程之间共享的字典。
  • 增添了符合 ES13 规范的 Array 方法: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

变更

  • 删除了 0.7.10 中引入的 Fetch API 中对 forbidden 请求头的特殊处理。
  • 从 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.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() 的 retval 问题。
  • 修复了使用函数表达式对已计算属性名称进行计算的问题。
  • 修复了数组中声明的函数表达式的隐式名称问题。
  • 修复了 for-in 循环的解析问题。
  • 修复了 Date.parse() 在 ISO-8601 格式和 UTC 时间偏移上的问题。

有关所有特性、变更及漏洞修复的完整列表,请参阅 njs 变更日志。

 

升级或试用 NGINX Plus

如果您是 NGINX Plus 用户,我们强烈建议您尽快升级到 NGINX Plus R30。除了上述所有新特性以外,您还将获得更多修复和改进。升级到最新版本有助于 NGINX 团队在您需要时为您快速提供支持。

如果您还不是 NGINX Plus 用户,我们建议您立即申请试用。您可将其用于安全防护、负载均衡及 API 网关用例,或者用作 Web 服务器 — 采用增强型监控和管理 API 并受全面支持。请立即下载 30 天免费试用版

Hero image
免费 O'Reilly 电子书:
《NGINX 完全指南》

更新于 2022 年,一本书了解关于 NGINX 的一切

关于作者

Prabhat Dixit

首席产品经理

关于 F5 NGINX

F5, Inc. 是备受欢迎的开源软件 NGINX 背后的商业公司。我们为现代应用的开发和交付提供一整套技术。我们的联合解决方案弥合了 NetOps 和 DevOps 之间的横沟,提供从代码到用户的多云应用服务。访问 nginx-cn.net 了解更多相关信息。