我们很高兴地宣布,NGINX Plus Release 21(R21)现已发布。NGINX Plus基于NGINX Open Source,是一款集负载均衡器、内容缓存、Web服务器和API网关于一体的产品。已有超过4.5亿个网站使用NGINX,NGINX Plus R21的可靠性和安全性进一步提升,主要采用了NGINX Open Source中的错误修复和稳定性改进。
NGINX Plus R21 的新功能包括:
- 动态gRPC代理:在将gRPC连接传递到后端gRPC服务时,我们新增了变量支持。这样,您可以根据客户端属性,将gRPC连接动态路由到不同的服务组。
- NGINX JavaScript模块增强功能:NGINX JavaScript模块(njs)已更新至0.3.9版,修复了多项错误,并增强了与子请求和文件系统支持相关的功能。
重要行为变更
- 可接受的请求:根据RFC 7230,NGINX Plus不再允许客户端请求包含多个
Host标头。 - 新增支持的操作系统:Alpine Linux 3.11。
- 不再支持的旧版操作系统:32 位平台(i386 架构)。
持续提升质量
高效的软件和高质量的代码是我们构建开源版NGINX和NGINX Plus时遵循的核心原则。
NGINX团队采用商业软件应具备的各种现代CI/CD和自动化测试工具。每日测试结果显示,活跃开发分支的“缺陷密度”非常低,每1,000行代码仅有0.01个缺陷;相比之下,规模相近的代码库平均每1,000行代码有0.7个缺陷。
我们还委托外部独立机构对开源组件和NGINX Plus组件进行渗透测试和代码审查。最近一次渗透测试和代码审查发现了若干问题,本版本已解决这些问题。
错误修复
NGINX Plus R21共修复了14个错误:
- 使用HTTP/2时发生套接字泄漏(两个独立的错误)
- 在njs模块和
aio指令中使用子请求时发生套接字泄漏 - 以下模块中可能出现内存耗尽:WebDav模块
- 可能存在于MP4模块中的内存泄露问题
- 使用
494指令重定向状态码为400的错误时,返回的状态码是494,而不是error_pagedirective - 处理SSL连接中的流水线请求时可能会发生超时
- 如果使用了“OCSP装订”,工作进程中可能会发生段错误
- 如果配置中包含替换字符串为空的
rewrite指令,则在启动或重新配置期间可能会发生段错误 - 如果在工作进程中将
break指令与alias指令结合使用,或与包含URI的proxy_pass指令结合使用,则可能发生段错误 - 仅处理了第一个
Transfer-Encoding请求标头 - 如果请求 URI 被重写为包含空字符的 URI,则
Location响应标头行可能包含乱码 - 使用
error_page指令返回重定向时,未能正确处理带有请求正文的请求 - 使用HTTP/2时,
debug_points指令存在错误
请注意,这些错误均不属于严重问题,也没有相关的CVE记录。
持续投入NGINX Plus路线图
在此版本发布之际,我们正在积极推进2020年路线图。预计今年晚些时候将推出可用于生产环境的HTTP/3(又称QUIC)实现。如果您有兴趣关注或测试这项技术,请留意未来几周发布的实验性补丁。
新功能详解
动态gRPC代理
NGINX Plus R15新增了将gRPC流量路由到上游组并进行负载均衡的支持。可以通过添加grpc_pass指令,使用NGINX Plus路由gRPC流量。
NGINX Plus R21在grpc_pass指令中引入了变量支持,可提供适用于gRPC工作负载的动态API驱动型路由策略,从而支持以下用例:
- A/B测试:按统计规则将gRRC请求分配到多个上游,以确定哪个上游的性能更好。
- 调试路由:将流量路由到生产环境中的gRPC服务,但将具有特定属性(源IP地址、gRPC元数据)的请求路由到调试用gRPC服务。
以下配置是调试路由的示例实现。
正在加载代码示例…
在第1行中,我们定义了一个可使用网络范围作为键的键值存储(通过 type=ip参数启用)。第2行指定,变量$greeter_upstream的值通过查询grpc-greeter键值存储来确定,并使用客户端IP地址($remote_addr)作为键。
在第10行中,我们将“grpc://$greeter_upstream”指定为“grpc_pass”指令的参数,用于终止TLS,并根据客户端的IP子网动态路由gRPC请求。
例如,可以在NGINX Plus实例上运行以下命令,将来自192.168.80.0/24子网的请求路由到grpc-servers-greeter-debug:
$ curl -iX POST -d '{"192.168.80.0/24":"grpc-servers-greeter-debug"}' http://localhost:8080/api/6/http/keyvals/grpc-greeter要将gRPC流量切换到生产服务组(grpc-servers-greeter-prod),请运行以下命令:
$ curl -iX PATCH -d '{"192.168.80.0/24":"grpc-servers-greeter-prod"}' https://localhost:8080/api/6/http/keyvals/grpc-greeterNGINX JavaScript 模块增强功能
NGINX JavaScript模块(njs)已更新至版本 0.3.9,修复了多项错误,并对与子请求和文件系统支持相关的部分功能进行了增强。
子请求
借助r.subrequest函数,njs代码可以向任意URI发出异步HTTP请求。该函数适用于多种用例,其中一个典型示例是调用外部身份验证服务器的API,例如OAuth 2.0令牌内省。此版本为子请求带来了两项重要增强:Promise和分离式子请求。
[编辑注:以下两个示例用例只是NGINX JavaScript模块众多用例中的一部分。有关完整列表,请参阅NGINX JavaScript模块用例。]
Promise
子请求通常包含一个用于处理子请求响应的回调函数。现在可以省略回调函数,改用JavaScript Promise在调用代码中直接处理响应。以下示例说明了如何在不使用回调的情况下,通过一段代码将连续的子请求串联起来。
正在加载代码示例…
分离的子请求
子请求以异步方式执行,以前必须通过js_content指令调用。现在,在变量求值期间,也可以通过js_set指令触发子请求。这些“分离式”子请求仍以异步方式执行,但不会向调用函数返回任何数据,所有响应都会被忽略。
以下示例代码使用分离式子请求,在交换的数据总量超过 1 MB 时,将请求标头的副本发送到安全信息和事件管理(SIEM)系统。
[编辑注:以下配置已更新为使用 js_import指令,该指令取代了 js_include指令(自NGINX Plus R23<.htmla>起)。有关详细信息,请参阅NGINX JavaScript模块的参考文档,其中的“配置示例”部分展示了NGINX配置文件和JavaScript文件的正确语法。]
正在加载代码示例…
随后,在写入访问日志时请求对变量求值,从而在日志阶段执行JavaScript代码。
正在加载代码示例…
文件系统
JavaScript文件系统对象“fs”已得到增强,支持使用Promise执行异步操作。此外,还新增了以下文件系统方法:access()、realpath()、symlink()和unlink()。
升级或试用 NGINX Plus
如果您正在运行NGINX Plus,强烈建议尽快升级到NGINX Plus R21。升级后还可获得多项其他修复和改进,并有助于NGINX在您需要提交支持工单时提供帮助。
如果您尚未试用过NGINX Plus,不妨亲自体验一下。它可用于安全防护、负载均衡和API网关,也可作为获得全面支持的Web服务器,并提供增强的监控和管理API。立即开始30天免费试用,亲自了解NGINX Plus如何帮助您交付应用并实现扩展。
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
