我们很高兴地宣布,旗舰产品NGINX Plus的第15个版本现已发布。自2013年首次发布以来,NGINX Plus的功能集和商业吸引力均显著提升。目前,NGINX Plus客户已超过[ngx_snippet name=’nginx-plus-customers’]家,另有[ngx_snippet name=’number-sites’]名NGINX Open Source用户。
NGINX Plus基于NGINX Open Source构建,是一款集负载均衡器、内容缓存、Web服务器和API网关于一体的解决方案。NGINX Plus提供专属增强功能,旨在降低现代应用架构设计的复杂性,并提供广受认可的支持服务。
NGINX Plus R15引入了新的gRPC支持、HTTP/2服务器推送、改进的集群支持、增强的API网关功能等:
- 原生gRPC支持:gRPC是由Google开发的新型远程过程调用(RPC)标准,可让客户端与服务器轻量、高效地通信。借助这项新功能,NGINX Plus可以对发往后端服务器的gRPC流量执行SSL终止、路由和负载均衡。
- HTTP/2服务器推送:借助HTTP/2服务器推送,NGINX Plus可在客户端实际请求资源之前将其发送,从而提升性能并减少往返通信次数。
- 跨集群共享状态:在此版本中,用于Sticky Learn会话持久性的共享内存数据可在集群中的所有NGINX Plus实例之间共享。NGINX Plus接下来的几个版本将进一步增强集群功能,并引入新的集群感知功能。
- OpenID Connect集成:现在,您可以使用NGINX Plus,通过OpenID Connect授权码流程并向客户端颁发JSON Web Token(JWT),为任何Web应用提供单点登录(SSO)。NGINX Plus可与CA Single Sign-On(原SiteMinder)、ForgeRock OpenAM、Keycloak、Okta、OneLogin、Ping Identity及其他常用身份提供商集成。
- NGINX JavaScript (njs)模块增强功能:njs模块(原名nginScript)支持在NGINX Plus处理请求期间运行JavaScript代码。HTTP njs模块现在支持发出独立于客户端请求且与其异步执行的HTTP子请求。这有助于满足API网关用例的需求,让您可以灵活地使用JavaScript修改和整合API调用。HTTP和TCP/UDP njs模块现在还包含加密库,可用于实现常见的哈希函数。
此版本还新增了更多功能,包括新的ALPN变量、多个动态模块的更新等。
行为变更
- NGINX Plus R13引入了全新的NGINX Plus API,可实现此前由多个独立API提供的功能,包括动态配置上游组和扩展指标。此前使用
upstream_conf和status指令配置的API现已弃用。建议检查配置中是否存在这些指令,并在条件允许时尽快改用新的api指令(有关详细信息,请参阅博客文章NGINX Plus R13发布公告)。从下一版本NGINX Plus R16开始,将不再提供已弃用的API。 - 此版本已将NGINX Plus API更新至版本3。以前的版本仍受支持。如果您考虑更新API客户端,请参阅API兼容性文档。
- 可从官方存储库获取的NGINX Plus软件包现已采用新的编号方案。NGINX Plus软件包和所有动态模块现在都会标明NGINX Plus版本号。每个软件包版本现在都与NGINX Plus版本相对应,以便更清楚地识别已安装的版本,并简化模块依赖关系。除非使用按版本号引用软件包的自动化系统,否则此变更不会产生影响。如果使用此类系统,请先在非生产环境中测试升级流程。
NGINX Plus R15 功能详解
gRPC支持
在此版本中,NGINX Plus可以代理gRPC流量并对其进行负载均衡。许多组织已使用gRPC与微服务进行通信。gRPC是由Google设计的开源高性能远程过程调用(RPC)框架,旨在实现高效、低延迟的服务间通信。gRPC要求使用HTTP/2而非HTTP 1.1作为传输机制,因为HTTP/2具备流量控制、多路复用和低延迟双向流式传输等特性,非常适合大规模连接微服务。
NGINX对gRPC流量进行路由和SSL终止
NGINX Open Source 1.13.10 开始支持 gRPC,NGINX Plus R15 现也已包含此功能。现在可以检查和路由 gRPC 方法调用,从而:
- 将NGINX Plus功能(包括HTTP/2 TLS加密、速率限制、基于IP地址的访问控制列表和日志记录)应用于已发布的gRPC服务。
- 通过检查gRPC连接并将其代理到内部服务,经由单个端点发布多个gRPC服务。
- 需要额外容量时,可通过将gRPC连接负载均衡到上游后端池来扩展gRPC服务。
- 将NGINX Plus用作gRPC和RESTful端点的API网关。
要了解更多信息,请参阅博客文章《NGINX 1.13.10 引入 gRPC 支持》。
HTTP/2服务器推送
第一印象至关重要,而页面加载时间是决定用户是否会再次访问网站的关键因素。HTTP/2 Server Push可减少用户需要等待的RTT(往返时间,即完成一次请求和响应所需的时间)次数,从而更快地响应用户。
NGINX可以主动向客户端推送资源,从而提升性能
HTTP/2服务器推送是NGINX开源社区呼声很高且备受期待的一项功能,于NGINX Open Source 1.13.9中推出。该功能现已纳入NGINX Plus R15,允许服务器预先发送完成此前由客户端发起的请求可能需要的数据。例如,浏览器需要样式表、图像等一系列资源来呈现网页,因此可以在客户端首次访问页面时立即发送这些资源,而不必等待浏览器明确请求。
在下面的配置示例中,我们使用http2_push指令,预先向客户端发送渲染demo网页所需的样式表和图像:
正在加载代码示例…
但在某些情况下,无法确定客户端所需的确切资源集,因此不适合在NGINX配置文件中列出具体文件。在这种情况下,NGINX可以拦截HTTP Link 标头,并推送其中标记为 preload 的资源。要启用对 Link 标头的拦截,请将 http2_push_preload 指令设置为 on。
正在加载代码示例…
如需了解详情,请参阅我们博客中的《NGINX 1.13.9 HTTP/2服务器推送功能介绍》。
集群内的状态共享
将多台NGINX Plus服务器配置为高可用性集群,可以增强应用的韧性,并消除应用堆栈中的单点故障。NGINX Plus集群专为韧性和高可用性至关重要的关键任务生产环境部署而设计。部署采用NGINX Plus的高可用性集群有多种解决方案。
NGINX Plus 的早期版本已引入集群支持,并提供两个级别的集群:
- 使用keepalived软件包实现网络弹性,在NGINX Plus服务器停机时处理故障转移。
- 使用
nginx-sync软件包同步配置,确保所有NGINX Plus服务器的配置保持同步。
NGINX Plus R15引入了第三级集群功能,即运行时状态共享,可在集群节点之间同步共享内存区中的数据。具体而言,现在可以使用面向TCP/UDP流量的新zone_sync模块,在集群的所有节点之间同步共享内存区中为Sticky Learn会话持久性存储的数据。
新增zone_sync模块
采用状态共享时,不存在主节点,所有节点均为对等节点,并通过全网状拓扑交换数据。此外,状态共享集群解决方案独立于用于保障网络韧性的高可用性解决方案。因此,状态共享集群可以跨物理位置部署。
NGINX Plus状态共享集群必须满足以下三项要求:
- 所有集群节点之间的网络连接
- 时钟已同步
- 每个节点上的配置都会启用
zone_sync模块,如下所示:正在加载代码示例…
The zone_sync指令用于同步集群中的共享内存区。zone_sync_server指令用于标识集群中的其他NGINX Plus实例。NGINX Plus支持DNS服务发现,因此可以通过主机名识别集群成员,并对每个集群成员使用相同的配置。
上述最低配置缺少在生产部署中保护同步数据所需的安全控制措施。以下配置片段采用了其中几项防护措施:
- 同步数据的SSL/TLS加密
- 客户端证书身份验证,使每个集群节点都能向其他节点表明身份(双向TLS)
- 使用IP地址的访问控制列表(ACL),确保只有同一物理网络中的NGINX Plus节点才能连接并进行同步
正在加载代码示例…
用于 Sticky Learn 会话持久性的状态共享
首个受支持的使用集群共享状态数据的NGINX Plus功能是Sticky Learn会话持久性。会话持久性是指始终将客户端的请求转发到处理该客户端首次请求的服务器。当会话状态存储在后端时,此功能非常有用。
在以下配置中,sticky learn指令定义了一个名为sessions的共享内存区。sync参数指示NGINX Plus将有关其共享内存区内容的消息发布到集群中的其他节点,从而实现集群范围的状态共享。
请注意,为确保状态数据正确同步,集群中每个NGINX Plus节点的配置都必须包含相同的upstream块及其中的sticky learn指令,还必须包含用于启用zone_sync模块的指令(如上文所述)。
正在加载代码示例…
注意:集群支持和 Sticky Learn 会话持久性仅在 NGINX Plus 中提供。
OpenID Connect 集成
许多企业使用身份和访问管理(IAM)解决方案来管理用户账户,并为多个应用提供单点登录(SSO)环境。企业通常希望将SSO扩展到新应用和现有应用,以降低复杂性和成本。
“将OpenID Connect与NGINX Plus结合使用,让我们能够快速、轻松地与身份提供商集成,同时简化应用架构。”——Scott Macleod,NHS Digital软件工程师
NGINX Plus R10新增了对验证OpenID Connect令牌的支持。在此版本中,我们扩展了这项功能,使NGINX Plus还可以控制授权码流程,以便通过OpenID Connect 1.0进行身份验证。NGINX Plus可与身份提供商通信,并向客户端颁发访问令牌。借助此功能,NGINX Plus可与大多数主流身份提供商集成,包括CA Single Sign‑On(原SiteMinder)、ForgeRock OpenAM、Keycloak、Okta、OneLogin和Ping Identity。扩展后的功能还支持:
- 无需修改旧版应用或对其进行现代化改造,即可将SSO扩展至这些应用
- 无需在应用程序代码中实现SSO或身份验证,即可将SSO集成到新应用程序中
- 消除供应商锁定;无需随应用部署IAM供应商的专有代理软件,即可获得基于标准的SSO
GitHub上提供了OpenID Connect与NGINX Plus集成的参考实现。该GitHub代码库包含示例配置,以及针对特定用例的安装、配置和微调说明。
NGINX JavaScript 模块增强功能
[编辑注:以下示例仅展示NGINX JavaScript模块的众多用例中的一部分。有关完整列表,请参阅《NGINX JavaScript模块用例》。
本节代码已按如下方式更新,以反映自本博客最初发布以来NGINX JavaScript实现的变化:
- 使用为Stream模块重构的会话(
s)对象,该对象在NGINX JavaScript 0.2.4中引入。 - 使用
js_import指令。该指令从js_include中的NGINX Plus R23及更高版本开始取代后者。有关详细信息,请参阅NGINX JavaScript 模块的参考文档,其中的“配置示例”部分展示了NGINX配置文件和JavaScript文件的正确语法。
]
借助NGINX JavaScript模块njs(原名nginScript),可以在NGINX配置中加入JavaScript代码,以便在处理HTTP或TCP/UDP请求时于运行时执行这些代码。这可支持多种潜在用例,例如更精细地控制流量、整合跨应用的JavaScript函数,以及抵御安全威胁。
NGINX Plus R15对njs进行了两项重要更新:子请求和哈希函数。
子请求
现在,您可以同时发出多个HTTP请求,这些请求独立于客户端请求,并与其异步执行。由此可支持多种高级用例。
以下JavaScript示例代码会同时向两个不同的后端发出HTTP请求。第一个响应将发送至NGINX Plus并转发给客户端,第二个响应则会被忽略。
正在加载代码示例…
对应NGINX Plus配置中的js_import指令会读取fastest_wins.js中的JavaScript代码。所有与根location(/)匹配的请求都会传递给sendFastest()函数,该函数会向/server_one和/server_twolocation发起子请求。原始URI及其查询参数会传递给相应的后端服务器。两个子请求都会执行done回调函数。但由于该函数包含r.return(),因此只有最先完成的子请求会将响应发送给客户端。
正在加载代码示例…
哈希函数
用于HTTP和TCP/UDP流量的njs模块现已包含一个加密库,其中实现了以下功能:
- 哈希函数:MD5、SHA‑1、SHA‑256
- HMAC 使用:MD5、SHA‑1、SHA‑256
- 摘要格式:Base64、Base64URL、十六进制
哈希函数的一个示例用例是为应用程序Cookie提供数据完整性保护。以下njs代码示例包含一个signCookie()函数,用于为Cookie添加数字签名;还包含一个validateCookieSignature()函数,用于验证已签名的Cookie。
正在加载代码示例…
以下NGINX Plus配置使用njs代码验证传入HTTP请求中的Cookie签名。如果验证失败,则向客户端返回错误消息;如果验证成功或请求中没有Cookie,则由NGINX Plus代理该请求。
正在加载代码示例…
NGINX Plus R15 的其他新功能
流模块的ALPN变量
应用层协议协商(ALPN)是TLS的一项扩展,支持客户端和服务器在TLS握手期间协商正在建立的连接将使用哪种协议,从而避免可能导致延迟并影响用户体验的额外往返通信。ALPN最常见的用例是:当客户端和服务器均支持HTTP/2时,自动将连接从HTTP升级到HTTP/2。
新的NGINX变量$ssl_preread_alpn_protocols最初在NGINX Open Source 1.13.10中引入,用于捕获客户端在ALPN预读阶段通过ClientHello消息公布的协议列表。采用以下配置后,XMPP客户端可通过ALPN标识自身,使NGINX Plus通过单一端点将XMPP流量路由到xmpp_backend上游组,将gRPC流量路由到grpc_backend,并将所有其他流量路由到http_backend。
要使NGINX Plus能够从ClientHello消息中提取信息并填充$ssl_preread_alpn_protocols变量,还必须添加ssl_preread on指令。
正在加载代码示例…
要了解详情,请参阅ngx_stream_ssl_preread模块的文档。
排队时间变量
NGINX Plus支持上游队列,因此,当上游组中的所有服务器都无法接受新请求时,无需立即拒绝客户端请求。
上游队列的一个典型用例是保护后端服务器免于过载,同时避免在所有服务器均繁忙时立即拒绝请求。可以使用max_conns参数为server指令中的每台上游服务器定义最大并发连接数。当没有可用的后端服务器时,queue指令会将请求放入队列。后端服务器不可用可能是因为已达到连接数上限,也可能是因为未通过健康检查。
在此版本中,新增的NGINX变量$upstream_queue_time(最初在NGINX Open Source 1.13.9中引入)可记录请求在队列中的停留时间。以下配置包含一种自定义日志格式,用于记录每个请求的多项时间指标;随后可离线分析这些指标,以便进行性能调优。我们将my_backend上游组的排队请求数限制为20。参数timeout用于设置请求在队列中的最长停留时间,超过该时间后将向客户端返回错误消息(默认错误代码为503)。此处将其设置为5 秒(默认为60 秒)。
正在加载代码示例…
如需了解详情,请参阅queue指令的文档。
无需转义的访问日志
现在可以在NGINX Plus访问日志中禁用转义。新的escape=none参数用于log_format指令。该参数最初在NGINX Open Source 1.13.10中引入,用于指定不对变量中的特殊字符进行转义。
LDAP身份验证参考实现更新
我们已更新使用LDAP身份验证系统对用户进行身份验证的参考实现,以解决相关问题并修复错误。在GitHub上查看。
无需root权限的透明代理
通过在transparent指令中为proxy_bind添加参数,可将NGINX Plus用作透明代理。工作进程现在可以从主进程继承Linux的CAP_NET_RAW能力,因此NGINX Plus进行透明代理时不再需要特殊权限。
注意:此功能仅适用于Linux平台。
JWT 宽限期
如果JWT包含基于时间的声明,例如nbf(生效日期)、exp(到期日期)或两者,则NGINX Plus在验证JWT时会检查当前时间是否在指定的时间区间内。但是,如果身份提供商的时钟与NGINX Plus实例的时钟不同步,令牌可能会意外过期,或显示为尚未生效。要设置两个时钟之间可接受的最大偏差,请使用auth_jwt_leeway指令。
Cookie Flag动态模块
用于设置Cookie标志的第三方模块现已作为Cookie-Flag动态模块在NGINX存储库中提供,并纳入NGINX Plus支持协议的保障范围。可使用软件包管理工具进行安装:
$ apt-get install nginx-plus-module-cookie-flag # Ubuntu/Debian$ yum install nginx-plus-module-cookie-flag # Red Hat/CentOSNGINX ModSecurity WAF模块更新
NGINX ModSecurity WAF是基于ModSecurity 3.0构建的NGINX Plus动态模块,现已更新并提供以下增强功能:
- 性能改进:
libmodsecurity - 修复了
ModSecurity-nginx 中的内存泄漏问题
[编者:NGINX ModSecurity WAF已于2022年4月1日正式停止销售,并将于2024年3月31日停止生命周期支持。有关详细信息,请参阅我们博客中的《F5 NGINX ModSecurity WAF即将停止生命周期支持》<.htmla>。]
升级或试用 NGINX Plus
NGINX Plus R15改进了客户端应用的身份验证功能,新增了集群功能,增强了njs,并包含重要的错误修复。
如果您正在运行NGINX Plus,强烈建议尽快升级到Release 15。升级后可获得多项修复和改进,也有助于我们在您需要提交支持工单时提供协助。有关NGINX Plus R15的安装和升级说明,请访问客户门户。
在继续升级之前,请仔细查看本博文中介绍的“新功能”和“行为变更”。
如果您尚未使用过NGINX Plus,不妨试用一下。它可用于Web加速、负载均衡和应用交付,也可用作提供全面支持的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的开源产品和商业产品。
