我们很高兴地宣布,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/。

用于Prometheus监控的新模块
NGINX Plus API以JSON格式返回指标,这是一种常见且便于与外部监控和应用性能管理(APM)解决方案集成的格式。现在还可以将指标导出为Prometheus格式,该格式在Kubernetes环境中尤其常用。
Prometheus-njs模块会公开Prometheus指标。要启用指标导出,请执行以下操作:
- 安装Prometheus-njs模块。
- 配置 NGINX Plus API。
- 在NGINX Plus配置文件中配置一个专用于收集Prometheus指标的location。
正在加载代码示例…
- 在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如何帮助您交付应用并实现扩展。
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
