NGINX Plus R30 正式发布

NGINX | 2023年8月15日

我们很高兴地宣布,NGINX Plus Release 30 (R30)现已发布。NGINX Plus基于NGINX Open Source,是一款集软件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 Open Source的新功能和错误修复,以及对NGINX JavaScript模块的更新。

重要行为变更

注意:如果从NGINX Plus R29以外的版本升级,请务必查看重要行为变更部分,具体请参阅从当前版本到此版本之间所有版本的以往版本公告博客。

弃用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;

Amazon Linux 2 上不提供 GeoIP2 模块

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

MQTT指令变更

用于指定构造MQTT消息所需缓冲区大小的mqtt_rewrite_buffer_size指令已由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月终止支持

新功能详解

原生支持QUIC+HTTP/3

许多企业客户一直期待并要求支持基于QUIC的HTTP/3,我们很高兴在NGINX Plus R30中正式推出此功能。这是一项新技术和新实现,我们将在后续版本中继续重点完善。建议NGINX Plus用户先在非生产环境中试用,并向我们提供宝贵反馈。

NGINX Plus依赖OpenSSL实现安全通信和加密功能,并使用操作系统随附的SSL/TLS库。但是,在此版本发布时,OpenSSL尚不支持QUIC的TLS接口,因此需要使用第三方库来提供HTTP/3所需但缺失的TLS功能。

为解决这一问题,NGINX团队开发了OpenSSL兼容层,无需再构建和分发quictls、BoringSSL和LibreSSL等第三方TLS库。这有助于在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 {
              # for better compatibility it's recommended
              # to use the same port for quic and https
              listen 8443 quic reuseport;
              listen 8443 ssl;

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

              location / {
                  # required for browsers to direct them into quic port
                  add_header Alt-Svc 'h3=":8443"; ma=86400';
              }
          }
      }

NGINX Plus R30中的QUIC+HTTP/3支持以单一二进制文件形式提供,与实验性HTTP/3支持不同,后者在NGINX Plus R29中引入,并为nginx quic提供了单独的二进制文件。这项改进让您可以更轻松地在自己的环境中部署此功能。

注意:从NGINX Plus R30开始,我们将停止对独立QUIC二进制文件的支持和更新,并计划于今年晚些时候取消其下载选项。

每个工作进程的连接遥测

NGINX Plus用户现在可以监控每个工作进程的连接总数,以便适当调整worker_connections指令。此项改进让用户能够更清楚地了解连接在各工作进程之间的分布情况。调整工作进程连接数还有助于更准确地评估NGINX部署。

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

要检索单个工作进程的每工作进程连接指标,请使用.../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 实时活动监控仪表板中查看,如下所示。访问 demo.nginx.com,查看此功能的在线演示。

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

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

连接:

  • 每个工作进程接受的连接数
  • 每个工作进程的活动连接数
  • 每个工作进程的空闲连接数
  • 每个工作进程丢弃的连接数

请求:

  • 每个工作进程的当前请求数
  • 每个工作进程的请求总数
  • 每个工作进程每秒的请求数

诊断包

为缩短问题解决周期,诊断包简化了收集NGINX环境问题排查所需数据的流程。诊断包还有助于避免因手动请求和收集问题排查所需信息而产生的信息偏差和延误,从而提高NGINX Plus客户与F5支持团队之间的沟通效率。

诊断包会收集以下信息:

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

添加诊断包旨在向用户清楚说明包内脚本会运行哪些命令以及会收集哪些数据。有关更多信息,请参阅“NGINX Plus Diagnostic Package”页面。

注意:诊断包的推出将作为当前NGINX Plus R30版本发布的一部分进行公告,但实际上并不依赖于该版本。今后,我们计划根据您和F5支持团队的反馈对其进行更新,以改进故障排除数据的收集流程。

NGINX Plus R30的其他增强功能

MQTT优化

通过改进消息队列遥测传输(MQTT)过滤器模块的内存消耗,吞吐量现已提升至原来的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 Open Source的更改

NGINX Plus R30基于NGINX Open Source 1.25.1,并继承了NGINX Plus R29发布后在NGINX 1.25.0和1.25.1中引入的功能变更、新功能和错误修复。

变更

  • HTTP/2 server push support has been removed. HTTP/2 server_push had minimal adoption and could only be used in very limited use cases. (As per IETF 102 reference documentation, it was used in just 0.04% of sessions. As per RFC 913 it was “difficult to be used effectively.”) HTTP/2 server push was disabled in Chrome version 106. As part of this change, the http2_push, http2_push_preload, and http2_max_concurrent_pushes directives have been made obsolete.
  • 已弃用的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/2。如果前言不匹配,则假定使用HTTP/0.9-1.1。
  • 新增支持在同一监听套接字上运行基于明文TCP的HTTP/2(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”指令
    • 已移除listen 的 http3 参数指令
    • 移除了stream模块对QUIC的支持
    • 移除了HTTP/3服务器推送
    • 修复了使用OpenSSL 3.2及更高版本构建OpenSSL Compatibility Layer时的问题

错误修复

  • 修复了正则表达式(regex)研究列表分配失败时发生的segfault。

有关从近期版本继承的所有新变更、功能、错误修复和解决方法,请参阅NGINX CHANGES文件。

NGINX JavaScript 模块变更

NGINX Plus R30 纳入了 NGINX JavaScript(njs)模块 0.8.0 版本中的变更。

功能

  • 引入了全局NGINX属性:
    ngx.build, ngx.conf_file_path, ngx.error_log_path, ngx.prefix, ngx.version, ngx.version_number和ngx.worker_id。
  • Introduced the js_shared_dict_zone directive for http and stream that allows declaring a dictionary shared between worker processes.
  • 新增了符合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。

更改

  • 移除了Fetch API中于0.7.10版本引入的对禁止标头的特殊处理。
  • 已从http模块中移除r.requestBody(),该方法已在0.5.0版本中弃用。应改用r.requestBuffer或r.requestText属性。
  • 已从http模块中移除r.responseBody(),该方法已在0.5.0版本中弃用。应改用r.responseBuffer或r.responseText属性。
  • 在r.internalRedirect()对http模块执行筛选时抛出异常。
  • 原生方法现可接收retval参数。此项更改会导致与njs的C扩展不兼容,因此需要修改代码。
  • 已移除不符合规范的弃用String方法。移除的方法如下:String.bytesFrom(), String.prototype.fromBytes(), String.prototype.fromUTF8(), String.prototype.toBytes(), String.prototype.toUTF8(), String.prototype.toString(encoding)。
  • 移除了使用GNU readline进行构建的支持。

错误修复

  • 修复了在r.status模块中进行筛选时的http设置器。
  • 修复了在Location标头中设置http模块的问题。
  • 修复了сrypto.getRandomValues()的返回值。
  • 修复了包含函数表达式的计算属性名求值问题。
  • 修复了数组中声明的函数表达式的隐式名称。
  • 修复了对 for-in 循环的解析。
  • 修复了Date.parse()在使用ISO-8601格式和UTC时间偏移量时的解析问题。

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

升级或试用 NGINX Plus

如果您正在运行NGINX Plus,强烈建议尽快升级到NGINX Plus R30。除了各项实用的新功能外,此版本还包含多项修复和改进。保持版本为最新状态,也有助于NGINX在您需要提交支持工单时提供帮助。

如果尚未试用过NGINX Plus,建议您体验一下。NGINX Plus可用于安全、负载均衡和API网关用例,也可用作获得全面支持的Web服务器,并提供增强的监控和管理API。立即开始30天免费试用。


分享
标签: F5 NGINX, 2023, News

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。