NGINX Plus R13 正式发布

NGINX | 2017年8月29日

我们很高兴地宣布,所有NGINX Plus订阅用户现均可免费升级到NGINX Plus Release 13(R13)。NGINX Plus基于NGINX Open Source构建,集Web服务器、负载均衡器和内容缓存于一体。NGINX Plus R13新增了多项功能,重点支持动态部署、增强调试能力,并提升安全性和性能。

NGINX Plus R13 新增以下支持:

  • 全新的 NGINX Plus API:通过单一整合端点执行动态配置并获取扩展状态指标;该 API 还新增了对键值存储的支持。
  • 请求镜像,将所有传入流量的副本发送到专用服务器,以便监控、检查和记录应用流量,同时不影响生产服务器的性能。
  • NGINX JavaScript模块增强功能:使用NGINX JavaScript模块(我们定制实现的JavaScript)进行编程式配置,以扩展NGINX Plus。[该模块以前称为nginScript。]新的njs交互式shell提供了一个控制台,可显示JavaScript的所有内置对象。您可以进一步查看这些对象,了解每个对象可用的方法和原语。
  • 动态模块构建工具:使用我们的新构建工具,为众多适用于NGINX和NGINX Plus的第三方模块创建可安装的软件包。

其他增强功能包括改进用于会话持久性的“sticky learn方法”、支持HTTP尾部标头,以及新增用于HTTP替换的第三方动态模块。

行为变更

NGINX R13功能详解

NGINX Plus API

NGINX Plus R13新增了一个REST API,统一通过单一端点提供。旧版NGINX Plus分别提供Upstream Conf API和Extended Status API。新API整合了二者的功能,还支持新的Key‑Value Store模块,可用于多种动态配置场景(详见下文“Key‑Value Store”部分)。

要启用NGINX Plus API,请在api指令中新增location块:

server {    listen 80;

    location /api {
        api write=on;
        # directives that allow access only by authorized users
    }
}

默认情况下,NGINX Plus API仅提供数据只读访问权限。将write=on参数添加到api指令中,以启用读写访问权限,从而可以更改上游服务器和新的键值存储模块。强烈建议仅允许授权用户访问该API,尤其是在启用读写模式时。

要查看该API端点提供的所有信息类型,请运行以下命令:

$ curl http://localhost:80/api/1/ ["nginx","processes","connections","ssl","slabs","http","stream"]

要显示特定类型信息的详细内容,请在请求URI末尾附加相应的字符串:

  • connections:显示总连接数的指标
  • http:显示HTTP流量指标并修改HTTP上游配置。在http下还有两个“子类型”:
    • http/server_zones,显示HTTP虚拟服务器的信息
    • http/upstreams:显示HTTP上游服务器组的信息并修改其配置
  • nginx:显示有关NGINX的常规信息
  • processes,显示有关NGINX工作进程的信息
  • slabs:显示NGINX分配的共享内存信息
  • ssl,实时显示SSL/TLS客户端的指标
  • stream:显示TCP/UDP流量指标,并修改TCP/UDP上游服务器组的配置(位于stream/upstreams)

扩展状态监控

除NGINX Open Source提供的指标外,NGINX Plus还可报告40多项专属指标。现在可以通过NGINX Plus API访问这些指标,并获取所需的重要指标。

例如,在URI后附加connections,即可输出连接状态快照,其中包括已接受、活动、已丢弃和空闲的客户端连接数。

$ curl http://localhost:80/api/1/connections{"accepted":3,"dropped":0,"active":1,"idle":0}

另一个示例:在URI后附加ssl,以实时输出SSL客户端统计信息的快照。

$ curl http://localhost:80/api/1/ssl {"handshakes":0,"handshakes_failed":0,"session_reuses":0}

动态配置上游服务器组

在NGINX Plus R12及更早版本中,可以使用upstream_conf指令动态配置现有的上游服务器组,而无需重新加载NGINX Plus。此功能现已集成到NGINX Plus API中。

此NGINX Plus配置片段在名为“backend”的上游组中定义了两台服务器,并在“/api”路径启用NGINX Plus API:

upstream backend {    zone backends 64k;
    server 10.10.10.2; 
    server 10.10.10.4;
}

server {
    listen 80;
    server_name www.example.org;

    location /api {
        api write=on;
    }
}

要将服务器添加到backend组,请在发送至/api/1/http/upstreams/backend/servers的curl请求中添加-d选项,并使用JSON文本定义新服务器的IP地址(此处为10.10.10.6)。-i选项表示响应中包含HTTP标头。(可以省略-X POST,因为使用-d时默认采用该方法,但为与其他方法保持一致,此处仍将其包含在内。)

$ curl -iX POST -d '{"server":"10.10.10.6"}' http://localhost/api/1/http/upstreams/backend/serversHTTP/1.1 201 Created
...

有关配置上游组的所有选项的详细信息,请参阅NGINX Plus API模块的参考文档。

键值存储

NGINX Plus R13引入了新的键值存储模块。可以使用NGINX Plus API在一个或多个“keyval”共享内存区域中动态创建、修改和删除键值对。随后,可将每个键值对的值作为变量求值,供NGINX Plus的其他功能使用。

要在键值存储中添加、修改、读取和删除条目,请分别使用POST、PATCH、GET和DELETE HTTP方法。键值存储提供丰富的动态配置方案,可与外部系统实时集成。

示例用例包括:

  • 动态 IP 拒绝列表(请参阅《NGINX Plus Admin Guide》)
  • 将URI路由到后端服务器
  • 管理每位用户的允许URI列表
  • 管理重定向规则(请参见以下示例)

以下配置片段使用Key-Value Store模块管理网站的易记网址。

keyval_zone zone=redirects:1M state=state/redirects.json;  # Save key-val pairs to filekeyval $uri $target zone=redirects;                        # $uri is the key, $target is the value

server {
    listen 80;

    location /api {
        api write=on; # Enable the NGINX Plus API (secure this location in production environments)
    }

    if ($target) {          # True when $uri exists in the 'redirects' keyval zone
        return 301 $target; # Redirect client to the matching value for the $uri
    }

    location / {
        proxy_pass http://backend;
    }
}

在keyval指令中,键设置为发出HTTP请求的远程计算机所使用的URI。如果$uri是键值存储中的键,则与该键关联的值会赋给一个名为$target的新变量。之后,如果$target存在,NGINX Plus会将客户端重定向到$uri对应的值。

要使用初始易记 URL 填充键值存储,请将数据编码为 JSON,并发送到 NGINX Plus API 的 URI。

$ curl -iX POST -d '{"/conf":"/conf2017"}' http://localhost/api/1/http/keyvals/redirectsHTTP/1.1 201 Created
...

现在,请求“/conf”的客户端会被重定向到“/conf2017”。

$ curl -i http://localhost/confHTTP/1.1 301 Moved Temporarily
Location: http://localhost/conf2017

可以使用PATCH方法向键值存储添加更多自定义短网址重定向,并动态修改现有条目。

$ curl -iX PATCH -d '{"/conf":"/conf2018"}' http://localhost/api/1/http/keyvals/redirectsHTTP/1.1 204 No Content
...

可以使用keyval指令为每个键值存储定义不同的共享内存区,从而配置多个相互独立的键值存储。有关详细信息,请参阅Key-Value Store模块的参考文档。

Swagger 文档

新的NGINX Plus API附带一份Swagger规范,可用于探索该API并了解各项资源的功能。Swagger文档随NGINX Plus一同提供,可通过http://nginx-host/swagger-ui/访问。

要使用Swagger UI的交互功能,需要启用NGINX Plus API。为此,请取消注释/api/位置块,该位置块位于conf.d/default.conf文件中。

# enable /api/ location with appropriate access control in order# to make use of NGINX Plus API
#
#location /api/ {
#    api write=on;
#    allow 127.0.0.1;
#    deny all;
#}

还可以访问以下网址,查看NGINX Plus API文档:https://demo.nginx.com/swagger-ui/。

注意:完整的NGINX Plus API(包括扩展状态指标、上游配置和新的键值存储模块)仅在NGINX Plus中提供。

请求镜像

借助NGINX Plus R13,可以启用HTTP请求镜像。此功能会克隆代理到上游组的HTTP请求,并将副本发送到其他目标。原始请求仍按常规方式处理,但克隆请求返回的任何响应都会被忽略。请求镜像有许多用例,包括:

  • 与以学习模式部署的Web应用防火墙(WAF)集成,以便在不影响生产流量的情况下分析典型请求模式
  • 使用实时生产流量进行性能调优,不影响生产环境
  • 在备份服务器上复制上传的文件,避免在Web服务器之间进行文件系统复制

启用请求镜像对系统整体吞吐量和性能的影响微乎其微。以下配置片段展示了如何使用新的mirror指令复制请求,并将其传递到单独的上游服务器。

location / {    mirror /mirror;
    proxy_pass http://backend;
}

location /mirror {
    internal;
    proxy_pass http://test_backend$request_uri;
}

请求将通过代理转发到backend上游组进行常规处理。同时,这些请求还会被克隆并通过代理转发到名为test_backend的独立上游组,并保留原始请求的URI。

注意:请求镜像功能最初随NGINX Open Source 1.13.4发布。

NGINX JavaScript模块增强功能

自NGINX Plus R12正式发布以来,NGINX JavaScript模块(原名nginScript)不断扩展对JavaScript核心语言功能的支持。此版本新增了对十六进制数(如0x7b)和科学记数法(如512e10)的支持,并实现了Object类的基本方法。

NGINX JavaScript现在还提供了一个交互式shell,可通过njs命令调用,以协助开发NGINX JavaScript代码。

以下shell代码片段展示了如何进入NGINX JavaScript交互式shell、定义一个表达式以生成未来30秒内的随机日期,以及计算两个数之和。

$ njsinteractive njscript
>> Date.now() + Math.round(Math.random()*30*1000);
1500976350968
>> 0x7b + 512e10;
5120000000123
>>

要了解更多信息,请参阅我们博客中的NGINX JavaScript<.htmla> 简介。

注意: NGINX JavaScript同时适用于NGINX Open Source和NGINX Plus。

动态模块构建工具

NGINX 1.11.5和NGINX Plus R11开始支持独立于NGINX本身编译动态模块。因此,NGINX和NGINX Plus用户可以使用NGINX, Inc.存储库中的官方构建版本,并仅加载所需的动态模块。

NGINX Plus R13 提供了一款构建工具,可将动态模块编译并打包为可安装模块,同时保留并遵循该模块与其链接的基础 NGINX 版本之间的依赖关系。

有关该构建工具的完整详情,请参阅博客文章《为动态模块创建可安装软件包》。

注意:该构建工具同时适用于NGINX Open Source和NGINX Plus。

更快的 Sticky-Learn 会话持久性

会话持久性是NGINX Plus负载均衡中一项非常实用的功能,可将特定客户端的所有请求发送到同一台服务器。建立会话持久性有多种方式;使用“sticky learn”方法时,NGINX Plus会检查是否存在特定Cookie,并在请求中包含该Cookie时,始终将该客户端绑定到同一台服务器。

借助NGINX Plus R13,上游服务器发送响应标头后即可建立粘性会话,无需等待完整的响应负载到达。因此,NGINX Plus可以尽早将粘性会话发送给客户端。请在header参数添加到sticky learn指令中:

upstream backends {    zone backends 64k;
    server 10.10.10.2; 
    server 10.10.10.4;
   
    sticky learn create=$upstream_cookie_sessionid
                 lookup=$cookie_sessionid
                 zone=client_sessions:1m
                 header;
 }

如果应用程序容易出错,并且需要客户端将失败的请求重新发送到同一上游服务器,则header参数尤其有用。

注意:Sticky‑learn 会话持久性仅适用于 NGINX Plus。

其他功能

NGINX Plus R13 引入了以下附加功能:

  • HTTP尾部字段:add_trailer指令支持在HTTP响应末尾添加任意尾部字段。尾部响应标头允许发送方在分块消息末尾添加其他字段,以提供可能在发送消息正文时动态生成的元数据,例如消息完整性校验或数字签名。
  • 替换过滤器动态模块:HTTP Substitutions Filter社区动态模块现已获得支持,并包含在我们的NGINX Plus发行版中。该模块可对响应正文执行正则表达式替换和固定字符串替换。它会扫描输出链缓冲区,并逐行匹配字符串。也可以在“Dynamic Modules”页面访问该模块。
  • 工作进程优雅关闭:使用worker_shutdown_timeout指令设置超时时间,以便更快完成工作进程的优雅关闭。收到关闭或重启信号后,如果超时时间已到,NGINX Plus会尝试关闭所有已打开的客户端连接。

升级到R13或试用NGINX Plus

如果您正在运行NGINX Plus,强烈建议尽快升级到Release 13。升级后可获得多项修复和改进;如果需要提交支持工单,也有助于我们更好地提供帮助。安装和升级说明可在客户门户中查看。

在继续升级之前,请仔细查看本博文中介绍的新功能和行为变更。

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


分享
标签: Security

关于作者

相关博客文章

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