NGINX Plus R14 正式发布

NGINX | 2017年12月12日

我们很高兴地宣布,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。
  • 用于location URI /admin 的块会检查变量$isAdmin。如果该变量为0,NGINX会向客户端返回状态码403 Forbidden。

借助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
>>

错误对象和回溯

为进一步帮助开发人员进行调试和故障排除,现已提供多种错误对象:

  • Error
  • EvalError
  • InternalError
  • RangeError
  • ReferenceError
  • SyntaxError
  • TypeError
  • URIError

此外,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销售代表。

注意事项:

  1. sticky learn集群功能目前处于预览阶段,因此不适合在生产环境中使用。如果跨集群共享状态是您环境中的一项重要要求,建议测试此技术预览版,并向NGINX反馈其满足您需求的程度。
  2. 技术预览包适用于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 | 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内容缓存方式的技巧。