NGINX Plus R19 正式发布

NGINX | 2019年9月03日


我们很高兴地宣布,NGINX Plus Release 19(R19)现已发布。NGINX Plus集负载均衡器、内容缓存、Web服务器和API网关于一体。NGINX Plus基于NGINX Open Source构建,提供专属增强功能和屡获殊荣的支持。此版本重点改进了监控功能,新增的功能可实现更精细、更灵活的监控,从而提高应用在大规模运行时的可靠性。

NGINX Plus R19 的新功能包括:

  • 更灵活的监控:我们新增了多项功能,可帮助您更细致地洞察和更轻松地分析NGINX Plus生态系统,包括可选择为location块单独收集指标、新增DNS查询活动指标,以及支持以Prometheus和JSON格式导出。NGINX Plus仪表盘会显示新增的各location指标,并新增用于显示DNS指标和NGINX Plus集群指标的选项卡。
  • 用于测试速率限制的试运行模式:为生产流量设置适当的速率限制既困难又存在很大风险;如果设置不当,可能会严重影响大量用户的体验。借助新的试运行模式,无需实际应用速率限制,即可了解其对生产流量的影响。
  • 键值存储增强功能:现在,除了单个IP地址外,还可以在键值存储中存储IP地址范围,并为各个条目设置过期时间。
  • 动态带宽控制:配置带宽限制时,现在可以将速率设置为变量,从而根据传入流量的任意属性应用不同的限制。

重要行为变更

  • 已废弃的API:NGINX Plus R13(发布于2017年8月)引入了全新的NGINX Plus API,用于指标收集和上游组的动态重新配置,取代了此前实现这些功能的Status API和Upstream Conf API。正如当时所宣布的那样,这些已弃用的API在相当长的一段时间内仍可使用并获得支持,直至NGINX Plus R16。如果配置中包含status和/或upstream_conf指令,则在升级到R19时必须将其替换为api指令。如需有关迁移到新版NGINX Plus API的建议和帮助,请参阅我们博客中的迁移指南,或联系我们的支持团队。
  • 新增支持的操作系统:
    • Alpine 3.10
    • Debian 10(“Buster”)
    • Ubuntu 19.04(“Disco”)
  • 不再支持旧版操作系统:
    • Debian 8(“Jessie”)
    • Ubuntu 14.04(“Trusty”)
    • Ubuntu 18.10(“Cosmic”)

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

新功能详解

新功能让监控更加灵活

NGINX Plus R19让监控更加灵活,不仅扩展了可收集的指标类型,还丰富了指标分析方式。

按 location 统计的指标

NGINX Plus API提供丰富的实时监控指标。在虚拟服务器的status_zone指令中添加server{}块后,即可获取该虚拟服务器的多项计数器指标。借助NGINX Plus R19,除了父级location块之外(或不监控父级块),还可以通过向各个server{}块添加status_zone指令,收集这些location块的指标。这种更精细的监控有助于更快确定网站中产生错误的具体部分,从而更有效地排查问题。

以下配置可为整个网站收集指标,还可为所有以/admin/开头的URI请求收集指标。

正在加载代码示例…

然后,可以通过http/location_zones端点访问这些指标。

$ curl http://localhost:8080/api/5/http/location_zones{
  "www_admin": {
    "requests": 3393,
    "responses": {
      "1xx": 0,
      "2xx": 3307,
      "3xx": 81,
      "4xx": 5,
      "5xx": 0,
      "total": 3393
    },
    "discarded": 0,
    "received": 15403,
    "sent": 835227
  }
}

也可以将status_zone指令放在if块中,但请注意,对于给定的location,指标只会统计一次,并以请求处理期间遇到的最后一个status_zone指令为准。以下配置扩展了上一个示例:每当对/admin/location的请求包含查询字符串时,都会单独收集指标。

正在加载代码示例…

DNS解析器指标

NGINX Plus API还扩展了用于跟踪DNS查询活动的指标,尤其是DNS请求类型和响应状态。要收集NGINX Plus为名称查询而访问的一组DNS服务器的相关指标,请将status_zone参数添加到resolver指令中。

正在加载代码示例…

然后,可以通过resolvers端点访问这些指标。

$ curl http://localhost:8080/api/5/resolvers{
  "internal_dns": {
    "requests": {
      "name": 132,
      "srv": 0,
      "addr": 0
    },
    "responses": {
      "noerror": 130,
      "formerr": 0,
      "servfail": 0,
      "nxdomain": 0,
      "notimp": 0,
      "refused": 0,
      "timedout": 2,
      "unknown": 0
    }
  }
}

实时活动监控仪表板更新

NGINX Plus实时活动监控仪表盘提供了一个便捷的集中位置,用于跟踪NGINX Plus API收集的指标。NGINX Plus R19扩展了该仪表盘,纳入了上述新的解析器指标和按位置统计的指标。此外,该仪表盘现在还会报告与集群运行时状态共享相关的指标(通过区域同步模块启用)。此前,这些指标只能通过NGINX Plus API访问。

有两个选项卡已重命名,并新增了两个选项卡:

  • HTTP Zones是Server zones选项卡的新名称。该选项卡现在会显示location块以及server块的指标。
  • HTTP Upstreams 是“Upstreams”选项卡的新名称。当同时配置HTTP和TCP/UDP模块时,这一名称更清晰。
  • 新的“Cluster”选项卡显示NGINX Plus集群中状态共享的相关指标。
  • 新的“解析器”选项卡显示DNS查询活动的指标。

要体验新版仪表板,请访问https://demo.nginx.com/。

NGINX Plus实时活动监控仪表板截图

用于Prometheus监控的新模块

NGINX Plus API以JSON格式返回指标,这是一种常见且便于与外部监控和应用性能管理(APM)解决方案集成的格式。现在还可以将指标导出为Prometheus格式,该格式在Kubernetes环境中尤其常用。

Prometheus-njs模块会公开Prometheus指标。要启用指标导出,请执行以下操作:

  1. 安装Prometheus-njs模块。
  2. 配置 NGINX Plus API。
  3. 在NGINX Plus配置文件中配置一个专用于收集Prometheus指标的location。

    正在加载代码示例…

  4. 在Prometheus配置文件的scrape_config部分中指定NGINX Plus实例的网络地址,以配置Prometheus从NGINX Plus获取指标。

在试运行模式下测试速率限制

NGINX Plus提供了高度灵活的速率限制方法,可同时跟踪并实施多个速率限制。限制措施有5种不同方式,包括延迟处理超量请求、直接拒绝此类请求,以及在实施限制前允许突发的请求不受限制,还可组合使用这些方式。有关详细说明,请参阅我们的博客。

这种灵活性可以实现非常精细的速率限制,但首先应如何为流量确定合适的速率限制值?如何提前判断计划设置的速率限制值是过高(可能导致服务器不堪重负)还是过低(可能影响用户体验)?

NGINX Plus错误日志是非常有用的信息来源。当NGINX Plus延迟处理或拒绝请求时,日志中会生成如下详细条目:

2019/09/03 11:42:12 [error] 57#57: *339 limiting requests, excess: 0.600 by zone "my_limit", client: 172.17.0.1, server: www.example.com, request: "GET / HTTP/1.1", host: "www.example.com:80"

该条目提供了一些实用信息,例如此请求超出配置速率的程度,以每毫秒请求数表示(excess字段);超出的具体限制(zone字段);以及客户端的IP地址(client字段)。但只有在实际对流量实施限制之前获取这些信息,它们才能用于规划。

NGINX Plus R19通过限速“试运行”模式增加了这项预测功能。系统会照常创建日志条目,但不会强制执行速率限制。要启用试运行模式,请将新的limit_req_dry_run指令与一个或多个limit_req指令放在同一块中。

在以下示例中,limit_req_zone指令定义了4种不同的速率限制,从每秒10,000个请求到每秒10个请求。我们在根limit_req块中使用location指令应用这些速率限制(第9至12行),并使用limit_req_dry_run指令停用强制执行。

正在加载代码示例…

对于每个可能超过给定速率限制的请求,NGINX Plus都会写入一条日志,并明确标记为“dry run”。分析日志时,可以按“zone”字段筛选条目,以确定哪项速率限制能够实现预期行为。

2019/09/03 11:56:26 [error] 142#142: *22282 limiting requests, dry run, excess: 1.000 by zone "1000rs", client: 172.17.0.1, server: www.example.com, request: "GET / HTTP/1.1", host: "www.example.com:80"

键值存储增强功能

借助NGINX Plus的内存键值存储,可以使用NGINX Plus API根据请求属性动态配置流量管理。典型用例包括动态将IP地址加入拒绝列表、动态限制带宽以及缓存身份验证令牌。

支持网络范围

NGINX Plus R19在原有支持单个IP地址的基础上,扩展了键值存储,新增对IP网络范围(子网)的支持。这意味着键值存储中的单个条目可以匹配某个网络范围内的所有IP地址,从而简化配置并节省时间,无需逐一添加构成该范围的地址。键值存储使用CIDR表示法来表示网络范围。例如,192.168.13.0/24表示从192.168.13.0到192.168.13.255的地址。IPv4和IPv6地址及其范围均受支持。

要启用网络范围,请在type=ip指令中添加新的keyval_zone参数,如以下用于动态将IP地址加入拒绝列表的配置所示。当NGINX Plus执行查找时,键值存储中所存网络范围内的任何IP地址都会匹配。

正在加载代码示例…

第2行指定,通过查询$in_denylist键值存储来计算变量denylist的值,并使用$remote_addr(客户端IP地址)作为键。随后,当客户端IP地址位于拒绝列表中时,简单的if块(第8至10行)会拒绝该请求。

以下curl命令调用NGINX Plus API,为上述网络范围在键值存储中创建一个条目。

$ curl -X POST -d '{"192.168.13.0/24":"1"}' http://localhost:8080/api/5/http/keyvals/denylist

每个条目的过期超时时间

在上一节中,timeout=24h 参数用于 keyval_zone 指令(位于 denylist.conf 的第 1 行),表示拒绝列表键值存储中的每个条目都会在创建 24 小时后过期(并从存储中移除)。

使用NGINX Plus R19时,可以为任意单个条目设置不同的超时时间,以覆盖默认超时时间(通过timeout参数为整个键值存储设置)。单个条目的超时时间可以长于或短于默认值。

要创建使用非默认超时值的条目,请将值指定为包含以下两个字段的JSON对象:

  • value:设置为所需值,在本例中设置为1,以填充$in_denylist变量
  • expire:设置该值在创建后经过多少毫秒过期

以下JSON表示localhost(127.0.0.1)的一个拒绝列表条目,该条目将在1小时(3,600,000毫秒)后过期。

{
  "127.0.0.1": {
    "value": "1",
    "expire": 3600000
  }
}

以下curl命令会在键值存储中创建该条目:

$ curl -X POST -d '{"127.0.0.1":{"value":"1","expire":3600000}}' http://localhost:8080/api/5/http/keyvals/denylist

动态带宽控制

The limit_rate指令用于设置NGINX Plus发送HTTP请求响应的速率(每秒字节数),而limit_rate_after指令用于设置NGINX Plus在应用该速率限制前发送的字节数。在NGINX Plus R19中,每个指令的参数都可以是变量,而非静态值,从而可根据请求属性动态控制带宽使用量。

以下示例配置根据客户端使用的TLS版本设置带宽,从而让较新的浏览器获得更快的响应。

正在加载代码示例…

在以前的NGINX Plus版本中,可以通过设置$limit_rate变量来限制带宽;建议改用这种更简便的方法。有关详细信息,请参阅limit_rate指令的文档。

用于TCP/UDP流量的proxy_download_rate和proxy_upload_rate指令现在也接受变量参数。

如需实现更精细的带宽限制,可以使用脚本扩展,例如NGINX JavaScript module (njs),通过高级自定义逻辑确定适合特定连接的带宽限制。

NGINX Plus生态系统更新

NGINX JavaScript 模块

NGINX JavaScript模块(njs)已更新至版本 0.3.5。主要增强功能(包括此前版本的累积更新)如下:

  • 支持箭头函数(感谢洪志道 [Hong Zhi Dao] 和 Artem S. Povalyukhin)
  • 全局process对象(尤其适用于读取环境变量)
  • String.prototype.trim 函数

升级或试用 NGINX Plus

如果您正在运行NGINX Plus,强烈建议尽快升级到NGINX Plus R19。升级后还可获得多项其他修复和改进,并有助于NGINX在您需要提交支持工单时提供帮助。

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

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


分享
标签: DNS

关于作者

相关博客文章

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