NGINX Plus R12 正式发布

NGINX | 2017年3月14日

[编者注:本文已更新为介绍NGINX Plus API。该API取代了原文中讨论的独立动态配置模块和状态模块,后两者现已弃用。]

今天,我们很高兴地宣布,所有NGINX Plus订阅用户均可免费升级到NGINX Plus R12。NGINX Plus是一款高性能软件应用交付平台,包含负载均衡器、内容缓存和Web服务器。NGINX Plus R12是一次重要版本更新,新增功能主要聚焦于集群、自定义和监控。

要详细了解NGINX Plus R12,请观看我们的点播网络研讨会。

新的集群功能可简化NGINX Plus服务器高可用集群的管理流程,为企业用户带来便利。所有用户都将受益于对nginScript的官方支持。nginScript是一种轻量级高性能脚本语言,直接嵌入NGINX配置中。监控与检测、缓存和运行状况检查方面的改进可提升应用的可靠性和性能。

进一步增强功能包括:为TCP服务提供客户端证书身份验证,支持检查OAuth JWT中的自定义字段,在Image-Filter模块中支持WebP格式,以及多项性能和稳定性改进。

建议所有订阅用户立即更新至NGINX Plus R12,以充分利用此版本在性能、功能和可靠性方面的改进。更新前,请务必查看下一节列出的行为变更。

行为变更

NGINX Plus R12对默认行为和NGINX Plus内部机制进行了一些更改,升级时需要注意:

  • 缓存元数据格式:内部缓存元数据标头的格式已更改。升级到NGINX Plus R12后,磁盘缓存将失效,NGINX Plus会根据需要自动刷新缓存。旧缓存条目会被自动删除。
  • SSL“DN”变量:$ssl_client_s_dn和$ssl_client_i_dn变量的格式已更改。现在使用逗号(,)而非正斜杠(/)作为字段分隔符,并按照RFC 2253和4514进行转义。要继续使用以正斜杠作为字段分隔符的X509_NAME_oneline格式,请使用$ssl_client_s_dn_legacy和$ssl_client_i_dn_legacy变量。
  • 最大连接数队列:queue指令用于指示NGINX Plus在上游服务器过载时将连接加入队列。由于R12进行了内存和性能优化,queue指令现在必须位于upstream块中指定负载均衡算法的指令之后(hash、ip_hash、least_conn或least_time)。
  • 第三方动态模块:动态模块由NGINX, Inc.开发或认证,可从我们的软件仓库获取。任何第三方模块都必须基于NGINX Open Source 1.11.10版重新编译,才能继续与NGINX Plus R12配合使用。有关更多信息,请参阅NGINX Plus管理指南。
  • 支持生命周期已结束的操作系统版本的最终发行版:Ubuntu已宣布终止对Ubuntu 12.04 LTS的支持,Red Hat也已宣布终止对Red Hat Enterprise Linux 5.10+的生产阶段支持,两者均自2017年3月31日起生效。NGINX Plus R12是最后一个为这些操作系统版本以及CentOS 5.10+和Oracle Linux 5.10+提供软件包和支持的发行版。要在NGINX Plus R12之后继续获得更新和支持,请升级到受支持的操作系统版本。

NGINX Plus R12 功能详解

配置共享

为实现高可用性和可扩展性,NGINX Plus服务器通常以包含两个或更多实例的集群方式部署。这样可以避免服务器故障影响服务,从而提高服务可靠性,还可通过横向扩展处理大量流量。

NGINX Plus已提供受支持的方法,可在集群中以主动-被动或主动-主动模式分配流量。NGINX Plus R12进一步增加了一种受支持的方法,用于在集群中同步配置。借助此配置同步功能,管理员可以从一个位置配置由NGINX Plus服务器组成的“集群”。这些服务器共享一组通用配置。

NGINX Plus配置从主节点推送到对等节点

配置同步方法如下:

  1. 在集群中指定一个或多个“主”节点。
  2. 在主节点上安装新的nginx-sync软件包。
  3. 将配置更改应用到一个主节点。
  4. 调用配置同步进程nginx-sync.sh(包含在nginx-sync软件包中),以更新集群中的其他各台服务器(即对等节点)。同步进程会在每个对等节点上执行以下步骤:
    1. 通过ssh或rsync将更新后的配置推送到对等服务器。
    2. 验证配置对对等节点是否有效;如果无效,则回滚该配置。
    3. 如果配置有效,则应用该配置,并重新加载对等节点上的NGINX Plus服务器。

当NGINX Plus部署在由两台(或更多)服务器组成的容错集群中时,此功能尤其有用。可以使用此方法简化集群内配置的可靠部署,或将配置从预发布服务器推送到生产服务器集群。

有关详细说明,请参阅《NGINX Plus Admin Guide》。

NGINX JavaScript 模块正式发布

我们很高兴地宣布,随NGINX Plus R12一同发布的NGINX JavaScript模块现已正式推出,可作为稳定模块用于NGINX Open Source和NGINX Plus。[该模块以前称为nginScript,本文将交替使用这两个名称。]NGINX Plus订阅用户可获得对nginScript的全面支持。

nginScript是一个面向NGINX和NGINX Plus的独特JavaScript实现<.htmla>,专为服务器端用例和逐请求处理而设计。借助该实现,可以使用JavaScript代码扩展NGINX Plus配置语法,从而实现复杂的配置解决方案。

借助nginScript,可以使用复杂逻辑记录自定义变量、控制上游选择、实现负载均衡算法、自定义会话持久性,甚至实现简单的Web服务。未来几周,我们将在博客上发布其中部分解决方案的完整说明,并在发布后将相关链接添加到此处。

具体而言,NGINX Plus R12 包括以下增强功能:

  • Preread phase in the Stream模块中的预读阶段
  • ECMAScript 6 Math方法和常量
  • 其他String方法,例如endsWith、includes、repeat、startsWith和trim
  • 作用域

尽管nginScript已趋于稳定,但相关工作仍在继续,以支持更多用例并扩大JavaScript语言覆盖范围。更多信息,请参阅博客文章《借助NGINX JavaScript模块,为每个请求充分发挥JavaScript的强大功能与便利性》<.htmla>。

新增统计信息

NGINX Plus中的监控和检测功能是一项重要的增值功能,可帮助您深入了解NGINX Plus和上游应用的性能与行为。统计数据既可通过内置图形化仪表板查看,也可以JSON格式导出到您常用的监控工具中。

实时活动监控仪表板已针对NGINX Plus R12进行更新

NGINX Plus R12新增了多项改进:提供有关负载均衡服务器性能(响应时间)的更多信息,深入了解TCP和UDP服务的运行情况,并提供一系列内部数据,帮助排查和识别问题以及调优NGINX Plus,从而优化性能。

NGINX Plus R12新增的统计信息包括:

  • 上游服务器响应时间:在NGINX Plus R11及更早版本中,仅当使用Least Time负载均衡算法时,才会计算上游服务器的响应时间。从NGINX Plus R12开始,所有算法都会测量响应时间,并在JSON数据和内置仪表板中报告。
  • 图形化仪表盘中的TCP/UDP上游响应代码。用于TCP/UDP负载均衡的Stream模块会生成伪状态代码,用于标识连接的关闭方式(200表示“成功”,502表示“上游不可用”等),并通过$status变量报告这些代码。NGINX Plus R12在仪表盘中新增了一系列列,用于显示TCP和UDP虚拟服务器的响应代码计数,与HTTP虚拟服务器已有的列类似。还可以记录这些伪状态代码,以便与现有日志分析工具集成。
  • NGINX Plus版本信息:为帮助排查问题,JSON数据现在会将NGINX Plus版本号报告为nginx_build(例如nginx-plus-r12),并将NGINX Open Source版本号报告为nginx_version(例如1.11.10)。仪表盘会在主选项卡左上角的框中显示这两个值。
  • 上游主机名:在JSON数据中,server字段通过IP地址和端口标识上游组中的服务器。新的name字段会报告upstream配置块中server指令的第一个参数。该参数可以是域名、UNIX域套接字路径,也可以是IP地址和端口。在仪表盘的Upstreams和TCP/UDP Upstreams选项卡中,最左侧的Name列现在会报告name字段的值,而不是server字段的值(NGINX Plus R11及更早版本报告的是后者)。如果使用DNS名称定义上游服务器,尤其是可解析为多个IP地址的名称,这项新指标有助于将JSON数据和仪表盘与上游服务器对应起来。
  • 扩展状态数据中的共享内存区利用率:共享内存区配置为固定大小,因此很难选择合适的大小,既不能过大(内存已分配但从未使用),也不能过小(内存耗尽并丢弃缓存项)。指标中新增的检测功能可提供每个共享内存区内存使用情况的详细内部报告,便于监控内存使用情况,也有助于NGINX技术支持团队针对NGINX配置优化提供更有依据的建议。
  • NGINX Plus访问日志中符合JSON规范的转义:一些现代日志分析工具可以高效提取JSON格式的日志文件,并且与未格式化的日志文件相比,更容易从中获取洞察。可以在标准NGINX Plus log_format 指令中定义JSON模板。该指令新增的可选参数 escape 可强制执行符合JSON规范的转义,确保日志行格式正确。

有关详细信息,请参阅“实时活动监控”。

增强型缓存

NGINX Plus R12显著增强了NGINX Plus缓存引擎。

更新期间提供过期内容

NGINX Plus R12新增了对Cache-Control扩展的支持,这些扩展定义于RFC 5861,即stale-while-revalidate和stale-if-error。现在,可以配置NGINX Plus遵循这些Cache-Control扩展,在后台刷新过期资源的同时,继续从缓存中提供这些资源,而不会增加客户端请求的延迟。同样,如果上游服务器不可用,NGINX Plus也可以从缓存中提供过期资源。这项技术可用于在微服务应用中实现断路器模式。

除非配置为忽略Cache-Control标头,否则NGINX Plus会遵循源服务器返回的符合RFC 5861规范的stale计时器。此类源服务器会返回Cache-Control标头,如下例所示:

Cache-Control: max-age=3600 stale-while-revalidate=120 stale-if-error=900

要启用对支持后台刷新的Cache-Control扩展的支持,请添加突出显示的指令:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    # ...
    location / {
        proxy_cache my_cache;

        # Serve stale content when updating
        proxy_cache_use_stale updating;
        
        # In addition, don’t block the first request that triggers the update
        # and do the update in the background
        proxy_cache_background_update on;

        proxy_pass http://my_upstream;
    }
}

The proxy_cache_use_stale updating指令会让NGINX Plus在内容更新期间提供其过期版本。如果只使用该指令,首位请求过期内容的用户会遭遇“缓存未命中”,即必须等到NGINX Plus从源服务器获取并缓存内容后才能收到内容。之后在内容更新期间请求该过期内容的用户可以立即从缓存中获取内容,而首位用户必须等到更新后的内容完成获取并缓存后才能收到内容。

借助新的proxy_cache_background_update指令,NGINX Plus在后台刷新内容时,会向所有用户(包括首位用户)提供过期内容。

这项新功能也可用于FastCGI、SCGI和uwsgi模块。

字节范围请求

缓存引擎经过进一步增强后,NGINX Plus可绕过缓存,处理起始位置与未缓存文件开头之间的距离超过所配置字节数的字节范围请求。这意味着,对于视频内容等大型文件,请求文件中较靠后的字节范围不会增加客户端请求的延迟。在早期版本的NGINX Plus中,只有当NGINX Plus从文件开头开始获取直至所请求字节范围的全部内容并将其写入缓存后,客户端才能收到所请求的字节范围。

新的proxy_cache_max_range_offset指令用于指定相对于文件开头的偏移量。超过该偏移量后,NGINX Plus会将字节范围请求直接传递到源服务器,并且不缓存响应。(这项新功能也适用于FastCGI、SCGI和uwsgi模块。)

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
    location / {
        proxy_cache my_cache;

        # Bypass cache for byte range requests beyond 10 megabytes
        proxy_cache_max_range_offset 10m;

        proxy_pass http://my_upstream;
    }
}

这些增强功能进一步巩固了NGINX Plus作为高性能、符合标准的缓存引擎的地位,适用于各种环境,既可用于加速应用交付,也可用于构建功能完备的内容分发网络(CDN)。

改进的健康检查

NGINX Plus R12进一步增强了NGINX Plus的主动健康检查功能。

对新添加的服务器执行健康检查

随着容器化环境和应用自动扩缩容组日益普及,负载均衡器必须实施主动的应用级健康检查,并为新服务器预留时间来初始化内部资源,使其达到正常运行状态。

在NGINX Plus R12之前,当您将新服务器添加到负载均衡池时(使用NGINX Plus API或DNS),NGINX Plus会立即将其视为健康状态并向其发送流量。在mandatory参数新增到health_check指令(HTTP或TCP/UDP)后,新服务器必须通过配置的健康检查,NGINX Plus才会向其发送流量。与slow-start功能结合使用时,这个新参数可让新服务器有更多时间连接数据库并完成“预热”,然后再处理其应承担的全部流量。

upstream my_upstream {     zone my_upstream 64k;
     server backend1.example.com slow_start=30s;
}

server {
    location / {
        proxy_pass http://my_upstream;
  
        # Require new server to pass health check before receiving traffic
        health_check mandatory;
    }
}

此处同时包含mandatory参数(用于health_check指令)和slow_start参数(用于server指令,适用于HTTP或TCP/UDP)。通过API或DNS接口添加到上游组的服务器会被标记为不健康,在通过健康检查之前不会接收任何流量;通过检查后,其接收的流量将在30 秒内逐渐增加。

零配置UDP健康检查

为UDP服务器实施应用级健康检查与为HTTP和TCP服务器实施此类检查同样重要,这样可以避免将生产流量发送到功能不完整的服务器。NGINX Plus支持UDP主动健康检查,但在NGINX Plus R12之前,必须创建一个match块,用于定义要send的数据和要expect的响应。使用二进制协议或握手过程复杂的协议时,确定适当的值可能颇具挑战。对于此类应用,NGINX Plus R12现支持UDP“零配置”健康检查,无需定义send和expect字符串即可测试应用可用性。要执行基本的UDP健康检查,请将udp参数添加到health_check指令中。

upstream udp_app {    server backend1.example.com:1234;
    server backend2.example.com:1234;
}

server {
    listen 1234 udp;
    proxy_pass udp_app;

    # Basic UDP health check
    health_check udp;
}

SSL 更新:TCP 服务的客户端证书及变量更新

SSL客户端证书通常用于对访问受保护网站的用户进行身份验证。在现有HTTP支持的基础上,NGINX Plus R12新增了对受SSL保护的TCP服务的身份验证支持。此功能通常用于机器间身份验证,而非最终用户登录;在对第4层协议进行负载均衡时,可使用NGINX Plus同时实现SSL终止和客户端身份验证。例如,可对使用MQTT协议进行通信的IoT设备进行身份验证。

The $ssl_client_verify变量现在包含有关客户端身份验证失败事件的更多信息,其中包括证书“已吊销”和“已过期”等原因。

变量$ssl_client_i_dn和$ssl_client_s_dn的格式已更改,以符合RFC 2253和RFC 4514。有关详细信息,请参阅“行为变更”。

增强的JWT验证

NGINX Plus R10引入了对JSON Web Token(JWT)的原生支持,适用于OAuth 2.0和OpenID Connect用例。其中一个主要用例是由NGINX Plus验证JWT、检查其中的字段,并将这些字段作为HTTP标头传递给后端应用。应用可将令牌验证工作交由NGINX Plus处理,并通过读取HTTP标头获取用户身份,从而轻松接入OAuth 2.0单点登录(SSO)环境。

NGINX Plus R10及更高版本可以检查JWT规范中定义的字段。NGINX Plus R12扩展了JWT支持,可将JWT中的任何字段(包括自定义字段)作为NGINX变量访问,从而用于代理、日志记录或授权决策。

升级或试用 NGINX Plus

如果您正在运行NGINX Plus,强烈建议尽快升级到Release 12。升级后可获得多项修复和改进,也有助于我们在您需要提交支持工单时提供帮助。有关安装和升级说明,请访问客户门户。

在继续升级之前,请参阅上述行为变更。

如果尚未试用过NGINX Plus,建议体验其Web加速、负载均衡和应用交付功能,也可将其用作提供全面支持的Web服务器,并通过API增强监控和配置管理。立即开始免费试用30天,亲自了解NGINX Plus如何帮助交付应用并实现横向扩展。


分享

关于作者

相关博客文章

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内容缓存方式的技巧。