博客 | NGINX

宣布推出 NGINX Plus R20

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


我们很高兴地宣布NGINX Plus Release 20(R20)现已推出。 NGINX Plus 是唯一负载均衡器、内容缓存、Web 服务器和 API 网关于一体的服务器。 NGINX Plus 基于 NGINX 开源,包含独有的增强功能和屡获殊荣的支持。

NGINX Plus R20在我们对 R19 中的速率限制和键值存储所做的增强基础上进行构建。 新功能包括:

  • 实时监控和记录速率限制流量- 配置速率限制后, NGINX Plus API现在会报告有多少请求被立即通过、延迟或拒绝。 您还可以配置访问日志以包含有关各个请求的速率限制状态的信息。
  • 连接限制的增强– R19 引入了速率限制的增强功能,并且此版本已扩展到连接限制。
  • 键值存储中的前缀匹配——键值存储中的键可以与指定的前缀(字符串开头的字符)匹配。 一个重要的用例是动态请求路由。
  • 每个上游组的 DNS 解析- 您现在可以为每个上游组指定一组不同的 DNS 服务器,这些服务器使用可解析的主机名来表示组中的后端服务器。
  • 附加的 PROXY 协议变量– 新变量捕获客户端最初连接到的代理服务器的 IP 地址和端口。
  • HTTP/2 的安全性改进——多项改进提高了 HTTP/2 流量的整体安全性,包括更好地检测不正确或无效的客户端行为,以及更稳健地实现某些指令。

行为方面的重要变化

  • 过时的 API - NGINX Plus R13 (于 2017 年 8 月发布)引入了全新的NGINX Plus API<.htmlspan>,用于指标收集和上游组的动态重新配置,取代了之前实现这些功能的 Status 和 Upstream Conf API。 正如当时宣布的那样,弃用的 API 仍然可用,并在相当长的一段时间内受到支持,直到NGINX Plus R16才结束。 如果您的配置包含statusupper_conf指令,则必须在升级到 R20 的过程中将它们替换为api指令。

    有关迁移到新NGINX Plus API 的建议和帮助,请参阅我们博客上的过渡指南,或联系我们的支持团队。

  • 支持的新操作系统

    • CentOS 8.0+
    • FreeBSD 12.1
    • Red Hat Enterprise Linux 8.1
    • Ubuntu 19.10(“Eoan Ermine”)

有关支持平台的更多信息,请参阅NGINX Plus动态模块的技术规范。

新功能详情

实时监控和记录限速流量

NGINX Plus R20引入了一些功能,使运营和 DevOps 团队可以更轻松地实时监控速率限制活动,并准确确定哪些客户端超出了速率限制。
NGINX Plus 始终在如何定义客户端请求类型以限制速率以及如何处理过多的请求方面提供了很大的灵活性。 每个请求都按下列方式之一进行处理:

  • 无延迟地通过(因为请求速率低于限制或在配置的突发大小内)
  • 延迟直到通过不会导致超出速率限制(也称为节流
  • 被拒绝并显示 HTTP 错误响应代码

在以前的版本中,错误日志是 NGINX Plus 记录请求被延迟或拒绝的唯一地方,以这样的标准化条目形式:

2019/12/02 11:42:12 [错误] 57#57: *339 限制请求,超出: 0.600 按区域“my_limit”,客户端: 172.17.0.1,服务器:www.example.com,请求: “GET / HTTP/1.0”,主机:“www.example.com:80”

从错误日志中提取有用的信息可能具有挑战性,因为消息格式是非结构化的并且不可配置。 此外,如果速率限制取决于错误日志条目中未注明的消息特征(例如 HTTP 标头或身份信息),那么您必须在访问日志中找到相应的条目,以准确确定哪个客户端超出了速率限制。 新功能解决了这些问题。

NGINX Plus API中的速率限制指标

NGINX Plus API的新端点/api/ version /http/limit_reqs维护由limit_req_zone指令定义的每个区域的速率限制决策的所有结果的计数器。 这些计数器既可用于实时监控速率限制决策,也可与 APM 解决方案集成,以提供有关速率限制活动的仪表板和警报。

在以下示例中,有一个定义的区域my_limit

$ curl http://localhost/api/6/http/limit_reqs { "my_limit": { "delayed": 540,"delayed_dry_run": 12162,“已通过”: 804541,“已拒绝”: 63,“rejected_dry_run”: 1209 } }

请注意,这些计数器还包括在NGINX Plus R19中引入的空运行模式下处理的过多请求的条目。

在访问日志中记录速率限制活动

实时指标对于了解 NGINX Plus何时处理过多请求非常有用,但它不会告诉您是生成了这些请求。 为了解决这一挑战, NGINX Plus R20提供了一个新的$limit_req_status变量。 它记录请求的速率限制状态: DELAYEDDELAYED_DRY_RUNPASSEDREJECTEDREJECTED_DRY_RUN

然后,您可以在日志格式中包含其他变量,以唯一标识客户端、URI 和任何其他相关信息。 在以下配置中,根据 JSON Web Token (JWT) 验证(第 1 行),对每个客户端强制实施每秒 10 次请求的严格速率限制。 过多的请求将被拒绝(第 16 行),并记录到单独的日志文件(第 21 行),其中还包括$jwt_claim_sub变量以捕获声明(第 4 行)。

rejection.log文件中的示例条目:

时间=1575289305.350 客户端=10.0.0.1 子=adam uri=/ 状态=429 limit_req=REJECTED时间=1575289305.395 客户端=10.0.0.1 子=adam uri=/ 状态=429 limit_req=REJECTED
时间=1575289305.402 客户端=10.0.0.1 子=adam uri=/ 状态=429 limit_req=REJECTED

连接限制增强功能

除了限制请求速率之外,NGINX Plus 还支持使用限制连接模块限制客户端连接。 您可以定义客户端可以向 NGINX Plus 打开多少个单独的连接(或使用 HTTP/2 时的并发请求数)。 客户端通常由远程 IP 地址( $remote_addr$binary_remote_addr变量)标识,但当远程 IP 地址不明确或可能由多个客户端共享时,您可以使用另一个变量(例如 JWT 中用户名的$jwt_claim_sub )。

NGINX Plus R20扩展了连接限制,并对NGINX Plus R19和此版本中引入的速率限制进行了相同的增强:

以下配置对打开超过十个并发连接的客户端应用低带宽。

键值存储中的前缀匹配

借助 NGINX Plus 的内存键值存储,您可以使用NGINX Plus API根据请求的属性动态配置流量管理。 示例用例包括IP 地址的动态拒绝名单动态带宽限制身份验证令牌的缓存

NGINX Plus R20增加了根据指定前缀(字符串开头的字符)匹配键的支持,为键值存储提供了一组新的用例。 例如,能够将键与 URI 前缀(基本路径)而不是精确的 URI 进行匹配意味着您可以创建一个动态路由表来将每个基本路径映射到上游组,从而替换或增强位置指令定义的静态映射。

要启用前缀匹配,请将新的type=prefix参数添加到keyval_zone指令中。 在以下配置中, keyval指令将Cache-Control指令(例如max-ageno-cache )与每个 URI 前缀相关联,并且当 NGINX Plus 将请求转发到上游服务器时, add_header指令将Cache-Control响应标头设置为该值。

我们使用NGINX Plus API为键值存储中的每个基本路径(在本例中,以/images//reports/开头的路径)定义Cache-Control响应标头的值:

$ curl -i -X POST --data '{"/images/":"max-age=3600", "/reports/":"no-cache"}' http://localhost:8080/api/6/http/keyvals/paths HTTP/1.1 201 已创建服务器:nginx/1.17.6 日期: 2019 年 12 月 2 日星期一 12:36:31 GMT 内容长度: 0 位置:http://localhost:8080/api/6/http/keyvals/paths/ 连接:保持活动

当我们使用键值存储中存在的基本路径发出请求时,响应将包含我们设置的Cache-Control标头:

$ curl -I http://localhost/images/sample.jpg HTTP/1.1 200 OK 服务器:nginx/1.17.6 日期: 2019 年 12 月 2 日星期一 12:27:39 GMT 内容类型:image/jpeg 内容长度: 120847 连接:保持活动缓存控制:最大年龄 = 3600

因为键值存储可以在 NGINX Plus 实例集群之间同步,所以每个 API 调用只需对一个实例进行即可。 这使得自动更改集群配置的过程比协调更改配置文件的过程简单得多。

每个上游组的 DNS 解析

当使用 NGINX Plus 在多个上游服务器之间执行负载均衡时,您可以通过指定解析为多个 IP 地址的主机名来定义上游组的成员。 这在动态或自动扩展环境中特别有用,因为上游组的成员可能会频繁变化。

为了完成这些动态上游组的配置,您还需要包括解析器指令来指定 NGINX Plus 查询与主机名关联的 IP 地址的 DNS 服务器。 在以前的版本中,解析器指令应用于包含该指令的上下文( httpserverlocation )中proxy_pass指令引用的所有上游组。 使用NGINX Plus R20,您现在可以为每个上游组指定不同的 DNS 解析器。

新的灵活性在 DevOps 环境中特别有用 - 它允许应用团队拥有更多的应用交付基础设施,包括 DNS 服务器和服务注册表,而不是依赖于集中的共享服务。

您仍然可以在顶级http上下文以及服务器位置块中定义全局解析器。 如果上游块不包含解析器指令,它将继承包含引用上游组的proxy_pass指令的上下文或块的解析器设置,就像在以前的版本中一样。

在以下示例中,网站上游组使用全局解析器,而mobile_app使用其自己的解析器:

请注意,我们将status_zone参数(NGINX Plus R19中引入)包含到两个解析器指令中,以收集有关解析器活动的错误和其他指标。

PROXY 协议服务器元数据的变量

PROXY 协议是一种机制,通过该机制,第 4 层代理可以将有关原始客户端连接的信息传达给处理客户端请求的下一个代理或负载均衡器。 这对于需要了解客户端 IP 地址的用例尤其重要 - 例如,限制每个客户端建立的连接数(使用least_conn指令)或只是记录真实客户端的 IP 地址。 与以前的版本一样, $proxy_protocol_addr变量捕获此信息。

当应用环境中部署多个第 4 层代理时,NGINX Plus 有时还需要知道客户端最初连接的代理服务器的 IP 地址和端口。 PROXY 协议元数据包含此信息, NGINX Plus R20添加了变量来捕获它:

这些变量适用于 HTTP 和 Stream(TCP/UDP)模块,并支持 PROXY 协议的版本 1 和 2。 请注意,在使用变量之前,您必须通过向listen指令添加proxy_protocol参数来明确启用 NGINX Plus 来处理 PROXY 协议。

HTTP/2 的安全改进

NGINX Plus R18 P1解决了8 月份公布的HTTP/2 中的三个安全漏洞。 NGINX Plus R20包括其他更改,可提高我们 HTTP/2 实现的整体安全性:

  • 改进了对不正确或无效客户端行为的检测
  • 改进了在读取客户端请求主体之前发送 HTTP/2 错误响应的功能
  • 提高了worker_shutdown_timeout指令对长寿命 HTTP/2 连接的稳健性
  • 提高了 HTTP/2 客户端的proxy_request_buffering指令的稳健性

如果您在生产中使用NGINX Plus R18 (未修补)或更早版本进行 HTTP/2,我们建议您尽快升级到NGINX Plus R20

NGINX Plus 生态系统更新

NGINX JavaScript 模块

NGINX JavaScript 模块 (njs) 已更新至版本0.3.7,增加对更多 JavaScript 对象的支持:

  • Function()构造函数
  • Object.assign()方法
  • 数字方法: toFixed()toPrecision()toExponential()
  • Array.prototype.copyWithin()方法
  • console.time()方法的标签参数

要了解有关 njs 的更多信息,请查看项目主页和我们的博客<.htmla>。

升级或尝试 NGINX Plus

如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到NGINX Plus R20 。 您还将获得许多额外的修复和改进,当您需要提出支持单时,它将帮助 NGINX 为您提供帮助。

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

如果您还没有尝试过 NGINX Plus,我们鼓励您尝试一下 – 为了安全、负载均衡和 API 网关,或者作为具有增强监控和管理 API 的完全支持的 Web 服务器。 您今天就可以开始享受30 天免费试用。 亲自了解 NGINX Plus 如何帮助您交付和扩展您的应用。


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