我们很高兴地宣布,NGINX Plus Release 14(R14)现已面向NGINX Plus订阅用户推出。NGINX Plus集负载均衡器、内容缓存和Web服务器功能于一体。它基于NGINX Open Source构建,并增加了专属功能以及屡获认可的全天候支持。NGINX Plus R14新增了安全和集群增强功能。
借助NGINX Plus,可以使用JSON Web令牌(JWT)实施访问控制。NGINX Plus R14新增了嵌套JWT声明支持,因此可以根据JWT中嵌套的组成员身份信息授予或拒绝访问权限。原生JWT身份验证支持首次引入于NGINX Plus R10,使NGINX Plus可用作API和应用的身份验证网关。
NGINX Plus R14的其他功能包括:
- 扩展的集群支持(技术预览),欢迎测试一项新功能的预览版,该功能可在集群中的各个NGINX Plus实例之间共享状态信息。在此预览版中,系统会共享sticky learn会话持久性方法的状态。在未来版本中,我们会将集群支持扩展到其他NGINX Plus功能。
- 更长的 JWT 密钥:除了支持嵌套 JWT 声明和数组数据外,JWT 签名算法现在还支持更长的密钥(最长 512 位)。这有助于提高 JWT 验证的安全性和灵活性。
- 流式键值存储和API:Release 13中为HTTP应用引入的强大键值存储和API现已扩展至
stream上下文中的TCP和UDP应用。 - NGINX JavaScript模块增强功能:该模块支持在NGINX Plus上运行JavaScript代码,现在进一步增强了对JSON对象的语言支持。[该模块以前称为nginScript。]借助这些增强功能,可以原生解析后端API返回的JSON响应并从中提取信息,还可以使用Node.js风格的方法访问文件系统。该模块现在还会在多种异常和错误对象出现时提供回溯信息,以便进行调试和故障排除。
- 更多功能,NGINX Plus还提供更新后的实时活动监控仪表板、新增的SSL变量以及上游服务器连接排空功能。
行为变更
- NGINX Plus API 已升级到版本 2。如果您考虑使用 NGINX Plus API 的新功能,请查阅API 兼容性文档。
- 自NGINX Plus R13起,Upstream-Conf和扩展Status模块中的API(通过
upstream_conf和status指令启用)已弃用。新的NGINX Plus API已取代这些API,R14中更新后的实时活动监控仪表板使用该API。 - NGINX Plus现已支持Ubuntu 17.10(Artful Aardvark)。
- NGINX Plus不再支持Debian 7(Wheezy)。
NGINX Plus R14功能详解
JWT增强功能
API和微服务的部署者正因JSON Web Token(JWT,读作“jot”)标准简单灵活而逐渐采用该标准。JWT是一种紧凑且高度可移植的身份信息交换方式。JWT可从多种签发方获取,包括Okta、OneLogin和自行开发的解决方案。随后,NGINX Plus可根据用户或API客户端是否提供有效的JWT来允许或拒绝访问。
NGINX Plus R14新增了对嵌套JWT声明和数组数据的支持,并支持JWT签名算法使用更长的密钥。这为JWT验证提供了更大的灵活性和更高的安全性。
支持嵌套JWT声明和数组数据
JWT有效负载可以包含有关用户的其他“嵌套”信息,例如用户所属的组。这些信息可用于授权访问资源,从而有助于避免为授权用户请求而多次查询数据库。
请看以下JWT载荷:
{ "exp": 1513429677,
"sub": "xample@example.com",
"aud": "nginx",
"attributes": {
"name": "Xavier Ample",
"room": "A123",
"dept": "Demonstrations"
},
"groups": [
"Administrator",
"Foobar",
"Bazpub"
]
}在上述JWT中,attributes是一个“嵌套声明”对象,groups是一个数组。可以使用以下配置片段,将attributes对象中的name值传递到后端,并拒绝不属于Administrator组的用户访问。
auth_jwt_claim_set $jwt_groups groups; # Array value will join as comma-separated valuesauth_jwt_claim_set $jwt_real_name attributes name; # This value is two levels deep
map $jwt_groups $isAdmin {
"~\bAdministrator\b" 1; # Appears within word boundaries (\b) of CSV list
default 0;
}
server {
listen 443 ssl;
#ssl_*; # Config for SSL/TLS termination
auth_jwt "closed site";
auth_jwt_key_file jwk.json;
location / {
proxy_set_header X-RealName $jwt_real_name; # Pass real name as header
proxy_set_header X-Subject $jwt_claim_sub; # L1 claims set automatically
proxy_pass http://my_backend;
}
location /admin {
if ( $isAdmin = 0 ) {
return 403; # Forbidden
}
proxy_pass http://my_backend;
}
}以下是此配置工作原理的更多详细信息:
- 使用
auth_jwt_claim_set指令,将NGINX变量$jwt_groups设置为JWT中定义的groups数组。数组中的值以逗号分隔,并赋给$jwt_groups。 - 使用
map指令在组列表中搜索Administrator关键字。如果存在,则将该用户视为管理员,并将$isAdmin设置为1。否则,将$isAdmin设置为0。 - 用于
locationURI /admin 的块会检查变量$isAdmin。如果该变量为0,NGINX会向客户端返回状态码403Forbidden。
借助NGINX Plus R14,还可以根据嵌套的JWT声明创建变量。随后,可先将这些变量添加到HTTP标头中,再将请求代理到后端服务器。
在上述示例中,我们使用auth_jwt_claim_set指令,将NGINX变量$jwt_real_name设置为attributes声明中name对象的值。proxy_set_header指令将X-RealName HTTP标头设置为name对象的值,并将请求代理到my_backend。
有关可用于通过NGINX Plus对JWT进行身份验证的所有配置指令的更多信息,请参阅参考文档。
JWT签名算法支持更长的密钥
NGINX Plus R14现支持256位、384位和512位签名密钥,可增强签名验证,并更轻松地与默认使用较长签名密钥的身份和访问管理(IAM)产品集成。所有受支持的签名算法均可使用这些较长的签名密钥:
- 采用SHA‑2的HMAC(“HS”)
- 采用SHA‑2的RSA PKCS #1(“RS”)
- 椭圆曲线数字签名算法(“ES”)
例如,可以将NGINX Plus R14配置为仅接受使用RS512算法签名的JSON Web令牌:
server { listen 443 ssl;
#ssl_*; # Config for SSL/TLS termination
auth_jwt "closed site";
auth_jwt_key_file jwk.json;
location / {
if ( $jwt_header_alg != RS512 ) {
return 401;
}
proxy_pass http://my_backend;
}
}在这种情况下,如果JWT未使用RS512算法签名,NGINX Plus不会代理请求,并向发出请求的客户端返回状态码401“Unauthorized”。
注意:仅NGINX Plus支持JWT。
Stream 模块的键值存储和 API
NGINX Plus R13 引入了用于HTTP的键值存储模块,支持在一个或多个共享内存区域中动态创建、修改和清除键值对。键值存储API的一个典型用例是将其与fail2ban结合使用,以创建动态IP拒绝列表。
NGINX Plus R14 新增了用于 Stream 的键值存储模块,使 TCP 和 UDP 应用也能使用与 HTTP 应用相同的键值对功能。
在stream上下文中动态重新配置键值存储的功能,已作为NGINX Plus API的一部分在NGINX Plus R14中实现。
注意:键值存储和API仅适用于NGINX Plus。
NGINX JavaScript 模块增强功能
NGINX JavaScript模块(原名nginScript)是一种基于JavaScript的脚本语言,适用于NGINX Plus。在NGINX Plus R14中,NGINX JavaScript的功能得到扩展,进一步提升了可编程性。更新后的NGINX JavaScript动态模块包提供以下新增功能。
JSON对象支持
JavaScript JSON对象现在可在NGINX JavaScript中作为原生对象使用。这为管理复杂数据结构提供了更便捷的方式,也使NGINX JavaScript能够解析和处理从后端API接收的JSON响应。
以下njs shell示例演示了如何使用内置对象语法解析和提取JSON数据。
$ njsinteractive njscript
v.<Tab> -> the properties and prototype methods of v.
type console.help() for more information
>> var my_data = '{"colors":[{"name":"red","fancy":"brick dust"}, {"name":"blue","fancy":"sea spray"}]}';
>> var my_object = JSON.parse(my_data);
>> my_object.colors[1].fancy;
sea spray
>>文件系统访问
Node.js是一种广受欢迎的服务器端JavaScript实现,提供了用于访问操作系统文件系统的内置方法(客户端JavaScript不允许访问文件系统)。借助NGINX Plus R14,现在可以在NGINX JavaScript中使用Node.js文件系统方法来读写文件,从而自定义应用交付工作流。允许执行以下操作:
- 读取:
fs.readFile,fs.readFileSync - 写入:
fs.writeFile,fs.writeFileSync - 追加:
fs.appendFile,fs.appendFileSync
此NGINX JavaScript shell示例展示了如何使用NGINX JavaScript将文件内容读取到变量中。
$ njsinteractive njscript
v.<Tab> -> the properties and prototype methods of v.
type console.help() for more information
>> var fs = require('fs');
>> var tz = fs.readFileSync('/etc/timezone');
>> tz
Europe/London
>>错误对象和回溯
为进一步帮助开发人员进行调试和故障排除,现已提供多种错误对象:
ErrorEvalErrorInternalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError
此外,NGINX JavaScript现在可为错误和异常提供回溯信息。以下错误日志条目显示了系统操作失败时的简单回溯信息。
2017/12/12 01:52:08 [error] 43441#43441: *10 js exception: Error: No such file or directory at native (native)
at my_function (:1)
at main (native)
, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:80"了解如何通过我们的博客开始使用NGINX JavaScript<.htmla>。
使用NGINX Plus API的NGINX Plus仪表板
NGINX Plus R13 引入了NGINX Plus API,支持以JSON格式访问实时监控数据和指标。在NGINX Plus R14中,内置的实时活动监控仪表板现已使用NGINX Plus API,可实时提供80多项监控指标。
旧版NGINX Plus中仪表板使用的动态重新配置API和扩展状态API已弃用。这些API在此版本中仍然可用,并将继续包含在NGINX Plus R15中。NGINX Plus R16将彻底移除这些API,因此建议立即更新配置。
已弃用的仪表板配置如下:
location /status { # DEPRECATED status; # DEPRECATED
# directives controlling access, such as 'allow' and 'deny'
}
location = /status.html { # DEPRECATED
root /usr/share/nginx/html; # DEPRECATED
}要将现有NGINX Plus实例迁移到新版NGINX Plus仪表板,请将之前的代码片段替换为以下内容:
location /api { api write=on;
# directives controlling access, such as 'allow' and 'deny'
}
location = /dashboard.html {
root /usr/share/nginx/html;
}
# Redirect requests made to the old dashboard
location = /status.html {
return 301 /dashboard.html;
}如代码片段所示,强烈建议限制对API的访问,例如使用allow和deny指令。请务必将现有访问控制从/status位置迁移到/api位置。
有关新版NGINX Plus API的更多信息,请参阅NGINX Plus R13公告。
注意:内置仪表盘仅适用于NGINX Plus。
在配置文件中排空上游服务器
将服务器下线时,可以允许现有会话完成,同时阻止建立新会话,从而改善用户体验。服务器会在所有活动会话结束后才下线。此过程称为对服务器进行“排空”。可以使用NGINX Plus API动态执行此操作,方法是向相关服务器的API资源发送包含PATCH请求,其中包含{"drain":true}。
NGINX Plus R14通过为上游drainserver指令提供参数,将此功能扩展到基于文件的配置。
upstream my_backend { server 10.0.0.1;
server 10.0.0.2;
server 10.0.0.3 drain;
}
重新加载NGINX Plus配置后,IP地址为10.0.0.3的上游服务器将进入连接排空模式。之后,可以移除相应的server指令,或将draining参数替换为down,从而彻底停用该服务器。
Sticky Learn 集群支持(技术预览)
我们很高兴地宣布,NGINX Plus R14提供一项即将推出的功能的技术预览,该功能可在NGINX Plus实例集群中共享状态。此技术预览实现了会话持久性的sticky learn方法,用于展示共享会话数据的优势;如果不共享,这些数据将由各实例分别管理。
该技术预览版以单独的可安装软件包形式提供,可按需申请。如需获取,请联系您的NGINX销售代表。
注意事项:
- sticky learn集群功能目前处于预览阶段,因此不适合在生产环境中使用。如果跨集群共享状态是您环境中的一项重要要求,建议测试此技术预览版,并向NGINX反馈其满足您需求的程度。
- 技术预览包适用于CentOS/RHEL/Oracle Linux 7、Debian 8和9,以及Ubuntu 16.04、16.10和17.10。
注意:集群支持和sticky‑learn会话持久性均为NGINX Plus独有功能。
其他功能
NGINX Plus R14还包括以下增强功能:
- 重新加载后保留解析器状态:动态重新配置上游组中服务器集合的一种方法,是将主机名或域名用作
server指令的参数;DNS会定期解析该名称,NGINX Plus会自动使用更新后的服务器集合(请参阅《NGINX Plus 管理指南》)。现在,重新加载NGINX Plus后,NGINX Plus仍会保留该主机名或域名的DNS记录。此前,重新加载后必须重新解析该名称,因此在解析完成前到达的请求无法得到处理。 - 新增SSL客户端证书变量:
$ssl_client_escaped_cert变量是一个新增的NGINX内置变量,可让您安全、便捷地将客户端证书编码到HTTP标头中,以便将其发送到后端应用程序。该变量采用URL编码。
升级或试用 NGINX Plus
NGINX Plus R14改进了客户端应用程序的身份验证功能,增加了集群功能,增强了NGINX JavaScript,并包含重要的错误修复。特别是,NGINX Plus R13引入了一个主动运行状况检查错误,可能导致旧工作进程无限期地执行运行状况检查。NGINX Plus R14已解决此问题。
如果您正在运行NGINX Plus,强烈建议尽快升级到Release 14。升级后可获得多项修复和改进,也有助于NGINX在您需要提交支持工单时提供协助。安装和升级说明可在客户门户中查看。
如果您尚未试用过NGINX Plus,不妨亲自体验一下。它可用于Web加速、负载均衡和应用交付,也可作为一款获得全面支持的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的开源产品和商业产品。
