我们很高兴地宣布 NGINX Plus Release 30 (R30) 已经推出。 NGINX Plus 基于 NGINX 开源,是唯一集 Web 服务器、负载均衡器、反向代理、内容缓存和 API 网关于一体的软件。
NGINX Plus R30 的新增功能和增强功能包括:
该版本还包括从 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 开启;
NGINX Plus 的早期版本使用来自 Amazon Linux 2 EPEL 存储库的“libmaxminddb”库来构建GeoIP2 模块。 EPEL 存储库不再提供此库,也无法从 Amazon Linux 2 发行版本地访问它。 因此,该模块在 NGINX Plus R30 中不再可用,因为没有可行的方法为 Amazon Linux 2 构建它。
mqtt_rewrite_buffer_size
指令用于指定构建 MQTT 消息的缓冲区大小,已被mqtt_buffers
指令取代。 新的指令允许指定每个连接可分配的缓冲区数量,以及指定每个缓冲区的大小。
NGINX Plus API 的版本号已从 8 更新为 9,以反映每个工作器连接遥测中描述的每个工作器指标的增加。 以前的版本号仍然有效,但输出不包含在后续 API 版本中添加的指标。
支持的新操作系统:
已删除旧操作系统:
较旧的操作系统已弃用并计划在 NGINX Plus R31 中删除:
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 二进制文件的支持和更新,并计划在今年晚些时候将其从下载选项中删除。
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 环境中的问题所需数据的过程。 诊断包还可以帮助避免与手动请求和收集解决问题所需信息相关的差异和延迟,从而使NGINX Plus 客户和 F5 支持之间的互动更加高效。
诊断包收集:
ps
、 lsof
、 vmstat
等)systemd
等。我们添加诊断包的目标是让用户透明地了解包中的脚本运行了哪些命令以及收集了哪些数据。 有关更多信息,请参阅NGINX Plus 诊断包页面。
笔记: 诊断包的可用性是作为当前 NGINX Plus R30 版本的一部分宣布的,但诊断包实际上并不依赖于版本。 展望未来,我们计划根据您和 F5 支持部门的反馈对其进行更新,以改进故障排除数据收集流程。
通过对消息队列遥测传输 (MQTT) 过滤器模块的内存消耗进行改进,现在吞吐量增加了 4-5 倍。
指令mqtt_rewrite_buffer_size
已被删除。 相反,新指令 mqtt_buffers <数量> <大小>
引入该参数是为了指定模块每个连接可以分配多少个缓冲区,以及每个缓冲区的大小。 缓冲区的默认数量为 100,每个缓冲区的默认大小为 1024 字节,这使得变量mqtt_buffers 的默认值为 <100> <1024>
。
NGINX Plus 现在会在重新加载时保留动态解析的上游主机的 DNS 名称过期时间,无需在重新加载配置时重新解析。 在此更新之前,所有上游都触发了 DNS 解析。 通过此更新,NGINX 保留所有上游的 DNS 解析和到期时间,并在重新加载时仅为新的或更改的上游触发 DNS 解析。
这种优化对于包含大量上游主机的 NGINX 环境影响最大。 如果您的 NGINX 配置中有 100 个或更多上游主机,则优化将最为明显。
NGINX Plus R30 基于 NGINX Open Source 1.25.1,继承了自 NGINX Plus R29 发布(在 NGINX 1.25.0 和 1.25.1 中)以来的功能变化、特性和错误修复。
server_push 的
采用率很低,只能在非常有限的用例中使用。 (根据 IETF 102 参考文档,它仅在 0.04% 的会话中使用。 根据 RFC 913,“它很难有效使用。”)HTTP/2 服务器推送在 Chrome 版本 106 中被禁用。 作为此更改的一部分, http2_push
、 http2_push_preload
和http2_max_concurrent_pushes
指令已被淘汰。ssl
指令不再受支持。 ssl
指令在 NGINX 1.15.0 中已被弃用,并由 listen 指令的ssl
参数取代。 弃用的 ssl 指令现已被删除。listen…http2
指令已被弃用。 建议用户改用http2
指令。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_
变量的逻辑存在缺陷,当某些元素被清除但仍保留在链接列表中时,会导致潜在的缓冲区溢出。 当使用第三方模块覆盖多标头值时会出现此问题。 更新版本引入了精细的边界检查,确保更安全地处理和评估这些变量。quic_mtu
指令listen 指令的 http3 参数
段错误
。有关从最新版本继承的新更改、功能、错误修复和解决方法的完整列表,请参阅 NGINX CHANGES文件。
NGINX Plus R30 吸收了 NGINX JavaScript (njs) 模块版本 0.8.0 的变化。
ngx.build 、 ngx.conf_file_path 、 ngx.error_log_path 、 ngx.prefix 、 ngx.version 、 ngx.version_number
和ngx.worker_id
。js_shared_dict_zone
指令,允许声明在工作进程之间共享的字典。Array.from()、Array.prototype.toSorted()、Array.prototype.toSpliced()、Array.prototype.toReversed()
。%TypedArray%.prototype.toSorted()、%TypedArray%.prototype.toSpliced()、%TypedArray%.prototype.toReversed()
。algorithm、extractable、type、usages
。r.requestBody()
,该模块在 0.5.0 版本中已被弃用。 应该使用r.requestBuffer
或r.requestText
属性。r.responseBody(),
该模块在 0.5.0 版本中已被弃用。 应该使用r.responseBuffer
或r.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)
。http
模块中过滤时修复r.status
设置器。http
模块中Location
标头的设置。сrypto.getRandomValues()
的返回值。Date.parse()
。有关所有功能、更改和错误修复的完整列表,请参阅 njs更改日志。
如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到 NGINX Plus R30。 除了所有出色的新功能之外,您还将获得一些额外的修复和改进,并且保持更新将有助于 NGINX 帮助您提出支持单。
如果您还没有尝试过 NGINX Plus,我们鼓励您尝试一下。 您可以将其用于安全、负载均衡和 API 网关用例,或将其用作具有增强的监控和管理 API 的完全支持的 Web 服务器。 立即开始30 天免费试用。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”