博客 | NGINX

宣布推出 NGINX Plus R13

NGINX-F5-horiz-black-type-RGB 的一部分
Liam Crilly 缩略图
利亚姆·克里利
2017 年 8 月 29 日发布

我们很高兴地宣布, NGINX Plus Release 13(R13)现在可供所有NGINX Plus订阅者免费升级。 NGINX Plus 是一个基于 NGINX 开源构建的组合式 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 可用的许多第三方模块创建可安装包。

进一步的增强包括对会话持久性的粘性学习方法的改进、HTTP 尾标支持以及用于 HTTP 替换的新第三方动态模块。

行为变化

  • 弃用模块– 以前用于扩展状态和上游组动态配置的 API(状态和上游配置模块)已弃用,并由统一的NGINX Plus API取代。弃用的 API 将与新的NGINX Plus API一起继续随 NGINX Plus 一起提供至少 6 个月。弃用的 API 将在 NGINX Plus 的未来版本中删除。
  • 删除的指令sticky_cookie_insert指令已在 NGINX Plus R13 中删除,并已在 NGINX Plus R2 中弃用。
  • 第三方动态模块- 从 NGINX 存储库安装的动态模块会自动升级到 R13。 任何第三方模块(即未包含在官方 NGINX repo中的模块)都必须针对 NGINX Open Source 1.13.4 重新编译才能继续与 NGINX Plus R13 一起使用。 有关更多信息,请参阅NGINX Plus 管理指南
  • ModSecurity 模块中的指令不再受支持– ModSecurity 的SecRequestBodyInMemoryLimit指令不再受支持。 客户可以安全地删除该指令,因为 ModSecurity 模块遵循 NGINX 配置定义的请求体处理。

    [编辑– NGINX Plus 的NGINX ModSecurity WAF模块于2022 年 4 月 1 日正式停止销售,并将于2024 年 3 月 31 日停止使用。 有关更多详细信息,请参阅我们博客上的“F5 NGINX ModSecurity WAF 正在过渡到终止使用<.htmla>”。]

  • 取消了对已停产操作系统版本的支持- NGINX Plus 不再支持 CentOS 5.10+、Red Hat Enterprise Linux 5.10+、Oracle Linux 5.10+、Ubuntu 12.04 LTS 或 Ubuntu 16.10。

NGINX R13 功能详情

NGINX Plus 接口

NGINX Plus R13 包含一个在单一端点下统一的新 REST API 。 NGINX Plus 的先前版本包含单独的上游配置扩展状态API。 新的 API 结合了两者的功能,并且还在各种用例中支持新的 Key-Value Store 模块进行动态配置(在下面的Key-Value Store部分中讨论)。

要启用NGINX Plus API ,请在位置块中包含新的api指令:

服务器 { listen 80;

location /api {
api write=on;
# 仅允许授权用户访问的指令
}
}

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

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

$ curl http://localhost:80/api/1/ ["nginx","进程","连接","ssl","slabs","http","流"]

要显示有关特定类型信息的详细信息,请将适当的字符串附加到请求 URI:

  • 连接– 显示总连接数的指标
  • 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 Plus 在 NGINX 开源版本的基础上报告了 40 多个独家指标。 您现在可以使用NGINX Plus API访问这些指标。使用 API 访问对您重要的指标。

举例来说,将连接附加到 URI 以输出连接状态的快照,其中包括已接受、活动、丢弃和空闲的客户端连接的数量。

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

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

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

上游服务器组的动态配置

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

此 NGINX Plus 配置代码片段在名为backend的上游组中定义了两个服务器,并在/api启用了NGINX Plus API

上游后端 { 区域后端 64k;
服务器 10.10.10.2; 
服务器 10.10.10.4;
}

服务器 {
listen 80;
server_name www.example.org;

location /api {
api write=on;
}
}

要将服务器添加到后端组,请在对/api/1/http/upstreams/backend/servers 的curl请求中包含-d选项,并使用定义新服务器 IP 地址的 JSON 文本(此处为 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/servers HTTP/1.1 201 已创建...

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

键值存储

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

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

示例用例包括:

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

以下配置片段使用键值存储模块来管理网站的虚荣网址

keyval_zone zone=redirects:1M state=state/redirects.json; # 将键值对保存到文件keyval $uri $target zone=redirects; # $uri 是键,$target 是值

server {
listen 80;

location /api {
api write=on; # 启用 NGINX Plus API(在生产环境中保护此位置)
}

if ($target) { # 当 $uri 存在于“redirects”键值区域中时为 True
return 301 $target; # 将客户端重定向到 $uri 的匹配值
}

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

keyval指令中,键设置为发出 HTTP 请求的远程计算机的 URI。 如果$uri是键值存储中的键,则与该键关联的值将被分配给名为$target的新变量。 然后,如果$target存在,NGINX Plus 会将客户端重定向到$uri的匹配值。

为了使用初始虚荣网址填充键值存储,我们将编码为 JSON 的数据发送到NGINX Plus API的 URI。

$ curl -iX POST -d '{"/conf":"/conf2017"}' http://localhost/api/1/http/keyvals/redirects HTTP/1.1 201 已创建...

现在请求/conf的客户端将被重定向到/conf2017

$ curl -i http://localhost/conf HTTP/1.1 301 临时移动位置:http://localhost/conf2017

您可以使用PATCH方法向键值存储添加更多虚荣 URL 重定向并动态修改现有条目。

$ curl -iX PATCH -d '{"/conf":"/conf2018"}' http://localhost/api/1/http/keyvals/redirects HTTP/1.1 204 无内容...

您可以使用keyval指令配置多个单独的键值存储,为每个键值存储定义不同的共享内存区域。 有关更多信息,请参阅键值存储模块的参考文档。

Swagger 文档

新的NGINX Plus API带有Swagger规范,可用于探索 API 并了解每种资源的功能。 Swagger 文档与 NGINX Plus 捆绑在一起,可以通过http:// nginx-host /swagger-ui/访问。

Swagger UI 的交互部分需要启用NGINX Plus API ,这可以通过取消注释conf.d/default.conf文件中的/api/位置块来实现。

# 启用 /api/ 位置并进行适当的访问控制以便# 使用 NGINX Plus API
#
#location /api/ {
# api write=on;
# allow 127.0.0.1;
# denied all;
#}

您还可以访问https://demo.nginx.com/swagger-ui/浏览NGINX Plus API文档。

笔记: 整个NGINX Plus API ,包括扩展的状态指标、上游配置和新的键值存储模块,都是 NGINX Plus 独有的。

请求镜像

使用 NGINX Plus R13,您可以启用 HTTP 请求镜像。 利用此功能,代理到上游组的 HTTP 请求将被克隆并发送到不同的目的地。 原始请求将照常处理,但克隆请求的任何响应都会被忽略。 请求镜像有很多用例,包括:

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

启用请求镜像对整个系统吞吐量和性能的影响可以忽略不计。 以下配置片段显示了如何使用新的镜像指令来克隆请求并将其传递给单独的上游服务器。

位置 / { 镜像 /mirror;
代理密码 http://backend;
}

位置 /mirror {
内部;
代理密码 http://test_backend$request_uri;
}

请求被代理到后端上游组进行常规处理。 它们也被克隆并代理到名为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 秒内随机日期的表达式,并计算两个数字的总和。

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

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

笔记: NGINX JavaScript 适用于 NGINX 开源和 NGINX Plus。

动态模块构建工具

NGINX 1.11.5 和 NGINX Plus R11 引入了独立于 NGINX 本身编译动态模块的支持。 这允许 NGINX 和 NGINX Plus 的用户使用来自 NGINX, Inc. 存储库的官方版本并仅加载他们需要的动态模块。

借助 NGINX Plus R13,我们提供了一个构建工具,用于将动态模块编译并打包为可安装模块,该模块保留并遵守它与所链接的基本 NGINX 版本之间的依赖关系。

有关构建工具的完整详细信息,请参阅我们博客上的为动态模块创建可安装包

笔记: 构建工具适用于 NGINX Open Source 和 NGINX Plus。

更快的粘性学习会话持久性

会话持久性是 NGINX Plus 负载均衡的一个非常有用的功能,它使您能够将所有请求从特定客户端发送到一台服务器。 有多种方法可以建立会话持久性;使用“粘性学习”方法,NGINX Plus 会查找特定 cookie 的存在,并在请求中包含该 cookie 时将客户端固定到同一服务器。

使用 NGINX Plus R13,您现在可以在上游服务器发送其响应标头后立即建立粘性会话,而不必等到完整的响应负载到达。 因此 NGINX Plus 可以尽早将粘性会话发送给客户端。 将新的header参数添加到sticky learn指令中:

上游后端 { 区域后端 64k;
服务器 10.10.10.2; 
服务器 10.10.10.4;

粘性学习 create=$upstream_cookie_sessionid
lookup=$cookie_sessionid
zone=client_sessions:1m
header;
}

如果应用容易出现错误,并且您希望客户端将失败的请求重新发送到同一个上游服务器,则标头参数特别有用。

笔记: Sticky‑learn 会话持久性是 NGINX Plus 独有的。

其他功能

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

  • HTTP 尾部- add_trailer指令可以将任意尾部添加到 HTTP 响应的末尾。 尾部响应标头允许发送者在分块消息末尾包含附加字段,以提供在发送消息正文时可能动态生成的元数据,例如消息完整性检查或数字签名。
  • 替换过滤器动态模块- HTTP 替换过滤器社区动态模块现已受支持并包含在我们的 NGINX Plus 发行版中。 该模块可以将正则表达式和固定字符串替换应用于响应主体。 它扫描输出链缓冲区并逐行匹配字符串。 您还可以在动态模块页面访问该模块。
  • 正常关闭工作进程- 使用worker_shutdown_timeout指令设置超时,以便更快地正常关闭工作进程。 当收到关闭或重启信号后超时,NGINX Plus 会尝试关闭所有打开的客户端连接。

升级到 R13 或尝试 NGINX Plus

如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到 Release 13。 您将获得大量修复和改进,如果您需要提出支持单,它将帮助我们为您提供帮助。 您可以在客户门户上找到安装和升级说明。

在继续升级之前,请仔细查看本博客文章中描述的新功能行为变化

如果您还没有尝试过NGINX Plus ,我们鼓励您尝试使用它来进行 Web 加速、负载均衡和应用交付,或者作为具有增强监控和管理 API 的完全支持的 Web 服务器。 您可以立即免费开始30 天评估,亲自了解 NGINX Plus 如何帮助您交付和扩展您的应用。


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”