我们很高兴地宣布NGINX Plus Release 20(R20)现已推出。 NGINX Plus 是唯一集负载均衡器、内容缓存、Web 服务器和 API 网关于一体的服务器。 NGINX Plus 基于 NGINX 开源,包含独有的增强功能和屡获殊荣的支持。
NGINX Plus R20在我们对 R19 中的速率限制和键值存储所做的增强基础上进行构建。 新功能包括:
过时的 API - NGINX Plus R13 (于 2017 年 8 月发布)引入了全新的NGINX Plus API<.htmlspan>,用于指标收集和上游组的动态重新配置,取代了之前实现这些功能的 Status 和 Upstream Conf API。 正如当时宣布的那样,弃用的 API 仍然可用,并在相当长的一段时间内受到支持,直到NGINX Plus R16才结束。 如果您的配置包含status
或upper_conf
指令,则必须在升级到 R20 的过程中将它们替换为api
指令。
有关迁移到新NGINX Plus API 的建议和帮助,请参阅我们博客上的过渡指南,或联系我们的支持团队。
支持的新操作系统–
有关支持平台的更多信息,请参阅NGINX Plus和动态模块的技术规范。
NGINX Plus R20引入了一些功能,使运营和 DevOps 团队可以更轻松地实时监控速率限制活动,并准确确定哪些客户端超出了速率限制。
NGINX Plus 始终在如何定义客户端请求类型以限制速率以及如何处理过多的请求方面提供了很大的灵活性。 每个请求都按下列方式之一进行处理:
在以前的版本中,错误日志是 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的新端点/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
变量。 它记录请求的速率限制状态: DELAYED
、 DELAYED_DRY_RUN
、 PASSED
、 REJECTED
或REJECTED_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和此版本中引入的速率限制进行了相同的增强:
limit_conn_dry_run
指令的试运行模式/api/ version /http/limit_conns
上进行实时监控$limit_conn_status
,用于捕获每个请求的连接限制决策( PASSED
、 REJECTED
或REJECTED_DRY_RUN
),并且可以按照在访问日志中记录速率限制活动中$limit_req_status
变量的描述使用以下配置对打开超过十个并发连接的客户端应用低带宽。
借助 NGINX Plus 的内存键值存储,您可以使用NGINX Plus API根据请求的属性动态配置流量管理。 示例用例包括IP 地址的动态拒绝名单、动态带宽限制和身份验证令牌的缓存。
NGINX Plus R20增加了根据指定前缀(字符串开头的字符)匹配键的支持,为键值存储提供了一组新的用例。 例如,能够将键与 URI 前缀(基本路径)而不是精确的 URI 进行匹配意味着您可以创建一个动态路由表来将每个基本路径映射到上游组,从而替换或增强位置
指令定义的静态映射。
要启用前缀匹配,请将新的type=prefix
参数添加到keyval_zone
指令中。 在以下配置中, keyval
指令将Cache-Control
指令(例如max-age
或no-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 调用只需对一个实例进行即可。 这使得自动更改集群配置的过程比协调更改配置文件的过程简单得多。
当使用 NGINX Plus 在多个上游服务器之间执行负载均衡时,您可以通过指定解析为多个 IP 地址的主机名来定义上游组的成员。 这在动态或自动扩展环境中特别有用,因为上游组的成员可能会频繁变化。
为了完成这些动态上游组的配置,您还需要包括解析器
指令来指定 NGINX Plus 查询与主机名关联的 IP 地址的 DNS 服务器。 在以前的版本中,解析器
指令应用于包含该指令的上下文( http
、 server
或location
)中proxy_pass
指令引用的所有上游组。 使用NGINX Plus R20,您现在可以为每个上游组指定不同的 DNS 解析器。
新的灵活性在 DevOps 环境中特别有用 - 它允许应用团队拥有更多的应用交付基础设施,包括 DNS 服务器和服务注册表,而不是依赖于集中的共享服务。
您仍然可以在顶级http
上下文以及服务器
和位置
块中定义全局解析器。 如果上游
块不包含解析器
指令,它将继承包含引用上游组的proxy_pass
指令的上下文或块的解析器
设置,就像在以前的版本中一样。
在以下示例中,网站上游组使用全局解析器,而mobile_app使用其自己的解析器:
请注意,我们将status_zone
参数(在NGINX Plus R19中引入)包含到两个解析器
指令中,以收集有关解析器活动的错误和其他指标。
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 协议。
NGINX Plus R18 P1解决了8 月份公布的HTTP/2 中的三个安全漏洞。 NGINX Plus R20包括其他更改,可提高我们 HTTP/2 实现的整体安全性:
worker_shutdown_timeout
指令对长寿命 HTTP/2 连接的稳健性proxy_request_buffering
指令的稳健性如果您在生产中使用NGINX Plus R18 (未修补)或更早版本进行 HTTP/2,我们建议您尽快升级到NGINX Plus R20 。
NGINX JavaScript 模块 (njs) 已更新至版本0.3.7,增加对更多 JavaScript 对象的支持:
Function()
构造函数Object.assign()
方法数字
方法: toFixed()
、 toPrecision()
和toExponential()
Array.prototype.copyWithin()
方法console.time()
方法的标签参数要了解有关 njs 的更多信息,请查看项目主页和我们的博客<.htmla>。
如果您正在运行 NGINX Plus,我们强烈建议您尽快升级到NGINX Plus R20 。 您还将获得许多额外的修复和改进,当您需要提出支持单时,它将帮助 NGINX 为您提供帮助。
在继续升级之前,请仔细查看本博客文章中描述的新功能和行为变化。
如果您还没有尝试过 NGINX Plus,我们鼓励您尝试一下 – 为了安全、负载均衡和 API 网关,或者作为具有增强监控和管理 API 的完全支持的 Web 服务器。 您今天就可以开始享受30 天免费试用。 亲自了解 NGINX Plus 如何帮助您交付和扩展您的应用。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”