我们很高兴地宣布,所有NGINX Plus订阅用户现均可免费升级到NGINX Plus Release 13(R13)。NGINX Plus基于NGINX Open Source构建,集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的第三方模块创建可安装的软件包。
其他增强功能包括改进用于会话持久性的“sticky learn方法”、支持HTTP尾部标头,以及新增用于HTTP替换的第三方动态模块。
行为变更
- 已弃用的模块:用于扩展状态和动态配置上游组的旧API(Status和Upstream Conf模块)已弃用,并由统一的NGINX Plus API取代。已弃用的API将继续随NGINX Plus一同提供至少6个月,并与新的NGINX Plus API并行提供。已弃用的API将在NGINX Plus的未来版本中移除。
- 已移除的指令:
sticky_cookie_insert指令已在NGINX Plus R13中移除,此前已在NGINX Plus R2中弃用。 - 第三方动态模块:从NGINX存储库安装的动态模块会自动升级到R13。任何第三方模块,即未包含在NGINX官方存储库中的模块,都必须针对NGINX Open Source 1.13.4重新编译,才能继续与NGINX Plus R13配合使用。有关更多信息,请参阅NGINX Plus管理指南。
- ModSecurity模块中的指令不再受支持:
SecRequestBodyInMemoryLimit是ModSecurity的一项指令,现已不再受支持。客户可以放心移除此指令,因为ModSecurity模块会遵循NGINX配置中定义的请求正文处理方式。[编辑注:NGINX ModSecurity WAF模块(适用于NGINX Plus)已于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 API
NGINX Plus R13新增了一个REST API,统一通过单一端点提供。旧版NGINX Plus分别提供Upstream Conf API和Extended Status API。新API整合了二者的功能,还支持新的Key‑Value Store模块,可用于多种动态配置场景(详见下文“Key‑Value Store”部分)。
要启用NGINX Plus API,请在api指令中新增location块:
server { listen 80;
location /api {
api write=on;
# directives that allow access only by authorized users
}
}默认情况下,NGINX Plus API仅提供数据只读访问权限。将write=on参数添加到api指令中,以启用读写访问权限,从而可以更改上游服务器和新的键值存储模块。强烈建议仅允许授权用户访问该API,尤其是在启用读写模式时。
要查看该API端点提供的所有信息类型,请运行以下命令:
$ curl http://localhost:80/api/1/ ["nginx","processes","connections","ssl","slabs","http","stream"]要显示特定类型信息的详细内容,请在请求URI末尾附加相应的字符串:
connections:显示总连接数的指标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 Open Source提供的指标外,NGINX Plus还可报告40多项专属指标。现在可以通过NGINX Plus API访问这些指标,并获取所需的重要指标。
例如,在URI后附加connections,即可输出连接状态快照,其中包括已接受、活动、已丢弃和空闲的客户端连接数。
$ curl http://localhost:80/api/1/connections{"accepted":3,"dropped":0,"active":1,"idle":0}另一个示例:在URI后附加ssl,以实时输出SSL客户端统计信息的快照。
$ curl http://localhost:80/api/1/ssl {"handshakes":0,"handshakes_failed":0,"session_reuses":0}动态配置上游服务器组
在NGINX Plus R12及更早版本中,可以使用upstream_conf指令动态配置现有的上游服务器组,而无需重新加载NGINX Plus。此功能现已集成到NGINX Plus API中。
此NGINX Plus配置片段在名为“backend”的上游组中定义了两台服务器,并在“/api”路径启用NGINX Plus API:
upstream backend { zone backends 64k;
server 10.10.10.2;
server 10.10.10.4;
}
server {
listen 80;
server_name www.example.org;
location /api {
api write=on;
}
}要将服务器添加到backend组,请在发送至/api/1/http/upstreams/backend/servers的curl请求中添加-d选项,并使用JSON文本定义新服务器的IP地址(此处为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/serversHTTP/1.1 201 Created
...有关配置上游组的所有选项的详细信息,请参阅NGINX Plus API模块的参考文档。
键值存储
NGINX Plus R13引入了新的键值存储模块。可以使用NGINX Plus API在一个或多个“keyval”共享内存区域中动态创建、修改和删除键值对。随后,可将每个键值对的值作为变量求值,供NGINX Plus的其他功能使用。
要在键值存储中添加、修改、读取和删除条目,请分别使用POST、PATCH、GET和DELETE HTTP方法。键值存储提供丰富的动态配置方案,可与外部系统实时集成。
示例用例包括:
- 动态 IP 拒绝列表(请参阅《NGINX Plus Admin Guide》)
- 将URI路由到后端服务器
- 管理每位用户的允许URI列表
- 管理重定向规则(请参见以下示例)
以下配置片段使用Key-Value Store模块管理网站的易记网址。
keyval_zone zone=redirects:1M state=state/redirects.json; # Save key-val pairs to filekeyval $uri $target zone=redirects; # $uri is the key, $target is the value
server {
listen 80;
location /api {
api write=on; # Enable the NGINX Plus API (secure this location in production environments)
}
if ($target) { # True when $uri exists in the 'redirects' keyval zone
return 301 $target; # Redirect client to the matching value for the $uri
}
location / {
proxy_pass http://backend;
}
}在keyval指令中,键设置为发出HTTP请求的远程计算机所使用的URI。如果$uri是键值存储中的键,则与该键关联的值会赋给一个名为$target的新变量。之后,如果$target存在,NGINX Plus会将客户端重定向到$uri对应的值。
要使用初始易记 URL 填充键值存储,请将数据编码为 JSON,并发送到 NGINX Plus API 的 URI。
$ curl -iX POST -d '{"/conf":"/conf2017"}' http://localhost/api/1/http/keyvals/redirectsHTTP/1.1 201 Created
...现在,请求“/conf”的客户端会被重定向到“/conf2017”。
$ curl -i http://localhost/confHTTP/1.1 301 Moved Temporarily
Location: http://localhost/conf2017可以使用PATCH方法向键值存储添加更多自定义短网址重定向,并动态修改现有条目。
$ curl -iX PATCH -d '{"/conf":"/conf2018"}' http://localhost/api/1/http/keyvals/redirectsHTTP/1.1 204 No Content
...可以使用keyval指令为每个键值存储定义不同的共享内存区,从而配置多个相互独立的键值存储。有关详细信息,请参阅Key-Value Store模块的参考文档。
Swagger 文档
新的NGINX Plus API附带一份Swagger规范,可用于探索该API并了解各项资源的功能。Swagger文档随NGINX Plus一同提供,可通过http://nginx-host/swagger-ui/访问。
要使用Swagger UI的交互功能,需要启用NGINX Plus API。为此,请取消注释/api/位置块,该位置块位于conf.d/default.conf文件中。
# enable /api/ location with appropriate access control in order# to make use of NGINX Plus API
#
#location /api/ {
# api write=on;
# allow 127.0.0.1;
# deny all;
#}还可以访问以下网址,查看NGINX Plus API文档:https://demo.nginx.com/swagger-ui/。
注意:完整的NGINX Plus API(包括扩展状态指标、上游配置和新的键值存储模块)仅在NGINX Plus中提供。
请求镜像
借助NGINX Plus R13,可以启用HTTP请求镜像。此功能会克隆代理到上游组的HTTP请求,并将副本发送到其他目标。原始请求仍按常规方式处理,但克隆请求返回的任何响应都会被忽略。请求镜像有许多用例,包括:
- 与以学习模式部署的Web应用防火墙(WAF)集成,以便在不影响生产流量的情况下分析典型请求模式
- 使用实时生产流量进行性能调优,不影响生产环境
- 在备份服务器上复制上传的文件,避免在Web服务器之间进行文件系统复制
启用请求镜像对系统整体吞吐量和性能的影响微乎其微。以下配置片段展示了如何使用新的mirror指令复制请求,并将其传递到单独的上游服务器。
location / { mirror /mirror;
proxy_pass http://backend;
}
location /mirror {
internal;
proxy_pass http://test_backend$request_uri;
}请求将通过代理转发到backend上游组进行常规处理。同时,这些请求还会被克隆并通过代理转发到名为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秒内的随机日期,以及计算两个数之和。
$ njsinteractive njscript
>> Date.now() + Math.round(Math.random()*30*1000);
1500976350968
>> 0x7b + 512e10;
5120000000123
>>要了解更多信息,请参阅我们博客中的NGINX JavaScript<.htmla> 简介。
注意: NGINX JavaScript同时适用于NGINX Open Source和NGINX Plus。
动态模块构建工具
NGINX Plus R13 提供了一款构建工具,可将动态模块编译并打包为可安装模块,同时保留并遵循该模块与其链接的基础 NGINX 版本之间的依赖关系。
有关该构建工具的完整详情,请参阅博客文章《为动态模块创建可安装软件包》。
注意:该构建工具同时适用于NGINX Open Source和NGINX Plus。
更快的 Sticky-Learn 会话持久性
会话持久性是NGINX Plus负载均衡中一项非常实用的功能,可将特定客户端的所有请求发送到同一台服务器。建立会话持久性有多种方式;使用“sticky learn”方法时,NGINX Plus会检查是否存在特定Cookie,并在请求中包含该Cookie时,始终将该客户端绑定到同一台服务器。
借助NGINX Plus R13,上游服务器发送响应标头后即可建立粘性会话,无需等待完整的响应负载到达。因此,NGINX Plus可以尽早将粘性会话发送给客户端。请在header参数添加到sticky learn指令中:
upstream backends { zone backends 64k;
server 10.10.10.2;
server 10.10.10.4;
sticky learn create=$upstream_cookie_sessionid
lookup=$cookie_sessionid
zone=client_sessions:1m
header;
}如果应用程序容易出错,并且需要客户端将失败的请求重新发送到同一上游服务器,则header参数尤其有用。
注意:Sticky‑learn 会话持久性仅适用于 NGINX Plus。
其他功能
NGINX Plus R13 引入了以下附加功能:
- HTTP尾部字段:
add_trailer指令支持在HTTP响应末尾添加任意尾部字段。尾部响应标头允许发送方在分块消息末尾添加其他字段,以提供可能在发送消息正文时动态生成的元数据,例如消息完整性校验或数字签名。 - 替换过滤器动态模块:HTTP Substitutions Filter社区动态模块现已获得支持,并包含在我们的NGINX Plus发行版中。该模块可对响应正文执行正则表达式替换和固定字符串替换。它会扫描输出链缓冲区,并逐行匹配字符串。也可以在“Dynamic Modules”页面访问该模块。
- 工作进程优雅关闭:使用
worker_shutdown_timeout指令设置超时时间,以便更快完成工作进程的优雅关闭。收到关闭或重启信号后,如果超时时间已到,NGINX Plus会尝试关闭所有已打开的客户端连接。
升级到R13或试用NGINX Plus
如果您正在运行NGINX Plus,强烈建议尽快升级到Release 13。升级后可获得多项修复和改进;如果需要提交支持工单,也有助于我们更好地提供帮助。安装和升级说明可在客户门户中查看。
如果您尚未试用过NGINX Plus,建议您体验其Web加速、负载均衡和应用交付功能,也可将其用作一款提供全面支持、具备增强型监控和管理API的Web服务器。立即开始免费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的开源产品和商业产品。
