{"id":21147,"date":"2017-12-12T14:04:34","date_gmt":"2017-12-12T05:04:34","guid":{"rendered":"https:\/\/jirak.net\/wp\/announcing-nginx-plus-r14\/"},"modified":"2017-12-13T00:36:53","modified_gmt":"2017-12-12T15:36:53","slug":"announcing-nginx-plus-r14","status":"publish","type":"post","link":"https:\/\/jirak.net\/wp\/announcing-nginx-plus-r14\/","title":{"rendered":"Announcing NGINX Plus R14"},"content":{"rendered":"<p>Announcing NGINX Plus R14<\/p>\n<p>We&#8217;re pleased to announce that NGINX Plus R14 is now available to our NGINX Plus subscribers. NGINX Plus is the only all-in-one load balancer, content cache, and web server. NGINX Plus R14 is based on the open source NGINX software and previous NGINX Plus releases. The new release also includes authentication and clustering enhancements, additional features, bug fixes, and our <a href=\"https:\/\/www.nginx.com\/blog\/nginx-customer-support-takes-gold-2017-stevie-awards\/\">award-winning 24-hour support<\/a>.<\/p>\n<p>With NGINX Plus R14, you can enforce access controls using JSON web tokens (JWT). With new support for nested JWT claims, NGINX Plus can allow or grant access based on group membership information nested inside a JWT. Native JWT authentication support, first introduced in NGINX Plus R10, enables NGINX Plus to be used as an authentication gateway for your APIs and applications.<\/p>\n<p>Additional NGINX Plus R14 features include: <\/p>\n<ul>\n<li><strong><a href=\"#clustersticky\">Extended clustering support<\/a> (technology preview)<\/strong>&nbsp;&ndash; With this technology preview, NGINX Plus can now share state information across a cluster. We invite you to test out this new functionality with the <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_upstream_module.html#sticky_learn\" rel=\"noopener\" target=\"_blank\">sticky learn<\/a> session persistence method. In future releases, we\u2019ll be expanding NGINX Plus clustering capabilities. <\/li>\n<li><strong><a href=\"#jwt\">Longer JWT key sizes<\/a><\/strong>&nbsp;&ndash; In addition to support for nested JWT claims and array data, longer key sizes up to 512 bits are now supported for JWT signing algorithms. This provides more security and flexibility when validating JWTs.<\/li>\n<li><strong><a href=\"#keyval\">Stream Key-Value store and API<\/a><\/strong>&nbsp;&ndash; The powerful Key-Value store and API introduced in our previous release can now be used with TCP and UDP applications in the <code>stream<\/code> context. <\/li>\n<li><strong><a href=\"#nginscript\">nginScript enhancements<\/a><\/strong>&nbsp;&ndash; nginScript, which enables you to run JavaScript code on NGINX, now has additional language support for the JSON object. This lets you parse and extract information from JSON responses received from backend APIs natively and use Node.js-style methods to access your filesystem. nginScript also now provides backtraces for a wide range of exception\/error objects when they occur, to facilitate debugging and troubleshooting.<\/li>\n<li><strong><a href=\"#additional\">More features<\/a><\/strong>&nbsp;&ndash; NGINX Plus also features an updated NGINX Plus dashboard, a new SSL variable, and upstream server draining.<\/ul>\n<\/li>\n<h2>Changes in Behavior<\/h2>\n<p>NGINX Plus R14 has the following differences in behavior from the previous release:<\/p>\n<ul>\n<li>The NGINX Plus API has been upgraded to Version 2. Check the <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_api_module.html#compatibility\" rel=\"noopener\" target=\"_blank\">API compatibility documentation<\/a> if you\u2019re considering using new NGINX Plus API features.<\/li>\n<li>The <code>upstream_conf<\/code> and extended status APIs have been deprecated as of the release of NGINX Plus R13. They have been superseded by the new NGINX Plus API, which is used by the new <a href=\"#dashboard\" rel=\"noopener\" target=\"_blank\">monitoring dashboard<\/a>. <\/li>\n<li>NGINX Plus is now available for Ubuntu 17.10 (Artful Aardvark).<\/li>\n<li>NGINX Plus is no longer supported on Debian 7 (Wheezy).<\/li>\n<\/ul>\n<h2>NGINX Plus R14 Features in Detail<\/h2>\n<h3 id=\"jwt\">JWT Enhancements<\/h3>\n<p>Deployers of APIs and microservices are turning to the JSON Web Token (JWT, pronounced \u201cjot\u201d) standard for its simplicity and flexibility. A JWT is a compact and highly portable means of exchanging identity information. A JWT can be issued from a number of issuers, such as Okta, OneLogin, or a homegrown solution. NGINX Plus can then grant or deny access based on whether or not the user or API client has presented a valid JWT.<\/p>\n<p>NGINX Plus R14 adds support for nested JWT claims and array data, as well as longer key sizes for JWT signing algorithms. This provides more flexibility and greater security when validating JSON web tokens (JWTs).<\/p>\n<h4>Support for Nested JWT Claims and Array Data<\/h4>\n<p>A JWT payload may contain additional \u201cnested\u201d information about the user, such as group membership, that can be used to authorize access to a resource. This helps avoid the need to query a database multiple times to authorize user requests. <\/p>\n<p>Considering the following JWT payload: <\/p>\n<pre><code class=\"config\">{<br \/>\n  \"exp\": 1513429677,<br \/>\n  \"sub\": \"xample@example.com\",<br \/>\n  \"aud\": \"nginx\",<br \/>\n  \"attributes\": {<br \/>\n    \"name\": \"Xavier Ample\",<br \/>\n    \"room\": \"A123\",<br \/>\n    \"dept\": \"Demonstrations\"<br \/>\n  },<br \/>\n  \"groups\": [<br \/>\n    \"Administrator\",<br \/>\n    \"Foobar\",<br \/>\n    \"Bazpub\"<br \/>\n  ]<br \/>\n}<\/pre>\n<p><\/code><\/p>\n<p>In the above JWT, <code>attributes<\/code> is a \u201cnested claim\u201d object and <code>groups<\/code> is an array. You can use the following configuration snippet to deny access to users who are not in the Administrator group and pass the name value from the <code>attributes<\/code> object to the backend. <\/p>\n<pre><code class=\"config\">auth_jwt_claim_set $jwt_groups groups; # Array value will join as comma-separated values<br \/>\nauth_jwt_claim_set $jwt_real_name attributes name; # This value is two levels deep<\/p>\n<p>map $jwt_groups $isAdmin {<br \/>\n\t\"~bAdministratorb\" 1; # Appears within word boundaries (b) of CSV list<br \/>\n\tdefault              0;<br \/>\n}<\/p>\n<p>server {<br \/>\n    listen 443 ssl;<br \/>\n    #ssl_*; # Config for SSL\/TLS termination<\/p>\n<p>    auth_jwt \"closed site\";<br \/>\n    auth_jwt_key_file jwk.json;<\/p>\n<p>    location \/ {<br \/>\n        proxy_set_header X-RealName $jwt_real_name; # Pass real name as header<br \/>\n        proxy_set_header X-Subject  $jwt_claim_sub; # L1 claims set automatically<br \/>\n        proxy_pass http:\/\/my_backend;<br \/>\n    }<\/p>\n<p>    location \/admin {<br \/>\n        if ( $isAdmin = 0 ) {<br \/>\n            return 403; # Forbidden<br \/>\n        }<br \/>\n        proxy_pass http:\/\/my_backend;<br \/>\n    }<br \/>\n}<\/pre>\n<p><\/code><\/p>\n<p>Here are more details on how this configuration works:<\/p>\n<ul>\n<li>Using the <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_auth_jwt_module.html#auth_jwt_claim_set\" rel=\"noopener\" target=\"_blank\"><code>auth_jwt_claim_set<\/code><\/a> directive, we set the <code>$jwt_groups<\/code> NGINX variable to the groups array defined in the JWT. The values in the array will be separated by commas and assigned to <code>$jwt_groups<\/code>.<\/li>\n<li>Using the <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_map_module.html#map\" rel=\"noopener\" target=\"_blank\"><code>map<\/code><\/a> directive, we search through the list of groups for the <code>Administrator<\/code> keyword. If present, the user is deemed an administrator and <code>$isAdmin<\/code> is set to 1. Otherwise <code>$isAdmin<\/code> is set to 0.<\/li>\n<li>The <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html#location\" rel=\"noopener\" target=\"_blank\"><code>location<\/code><\/a> block for the URI <strong>\/admin<\/strong> checks the <code>$isAdmin<\/code> variable. If 0, NGINX will return a <code>403 Forbidden<\/code> status code back to the client.<\/li>\n<\/ul>\n<p>With NGINX Plus R14, you can also create variables from nested JWT claims. The variables can then be put into  HTTP headers before proxying them to backend servers.<\/p>\n<p>In the above code example, using the <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_auth_jwt_module.html#auth_jwt_claim_set\" rel=\"noopener\" target=\"_blank\"><code>auth_jwt_claim_set<\/code><\/a> directive, we set the <code>$jwt_real_name<\/code> NGINX variable to the value of the name object within the <code>attributes<\/code> claim.  The <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_set_header\" rel=\"noopener\" target=\"_blank\"><code>proxy_set_header<\/code><\/a> directive will set the X-RealName HTTP header to the value of the <code>name<\/code> object and proxy the request to <code>my_backend<\/code>.  <\/p>\n<p>Click <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_auth_jwt_module.html\" rel=\"noopener\" target=\"_blank\">here<\/a> for more information on all the configuration directives available for use to authenticate JWTs with NGINX Plus.<\/p>\n<h4>Longer Key Sizes for JWT Signing Algorithms<\/h4>\n<p>NGINX Plus R14 now supports 256-bit, 384-bit, and 512-bit signing keys for stronger signature validation and easier integration with identity and access management (IAM) products that use longer signing keys by default. The longer signing keys are available for all supported signature algorithms:<\/p>\n<ul>\n<li>HMAC with SHA-2 (\u201cHS\u201d)<\/li>\n<li>RSA PKCS #1 with SHA-2 (\u201cRS\u201d)<\/li>\n<li>Elliptic Curve Digital Signature Algorithm (\u201cES\u201d)<\/li>\n<\/ul>\n<p>For example, you can configure NGINX Plus R14 to only accept JSON web tokens signed with the RS512 algorithm:<\/p>\n<pre><code class=\"config\">server {<br \/>\n    listen 443 ssl;<br \/>\n    #ssl_*; # Config for SSL\/TLS termination<\/p>\n<p>    auth_jwt \"closed site\";<br \/>\n    auth_jwt_key_file jwk.json;<\/p>\n<p>    location \/ {<br \/>\n        if ( $jwt_header_alg != RS512 ) {<br \/>\n            return 401;<br \/>\n        }<br \/>\n        proxy_pass http:\/\/my_backend;<br \/>\n    }<br \/>\n}<\/pre>\n<p><\/code><\/p>\n<p>In this case, if the JWT has not been signed by the RS512 algorithm, NGINX will not proxy the request, and will return a <code>401 Unauthorized<\/code>  status code back to the client that issued the request. <\/p>\n<p><strong>Note<\/strong>: JWT support is exclusive to NGINX Plus.<\/p>\n<h3 id=\"keyval\">Key-Value Store and API for Stream Module<\/h3>\n<p>NGINX Plus R13 introduced the <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_keyval_module.html\" rel=\"noopener\" target=\"_blank\">Key-Value store module for HTTP<\/a>, allowing you to create, modify, and purge Key-Value pairs in one or more shared memory zones on the fly. One great use case for the Key-Value store API is using it with fail2ban to <a href=\"https:\/\/www.nginx.com\/blog\/dynamic-ip-blacklisting-with-nginx-plus-and-fail2ban\/\" rel=\"noopener\" target=\"_blank\">create a dynamic IP blacklist<\/a>. <\/p>\n<p>NGINX Plus R14 has extended the support for the <a href=\"http:\/\/www.nginx.org\/en\/docs\/stream\/ngx_stream_keyval_module.html\" rel=\"noopener\" target=\"_blank\">Key-Value store API to the stream module<\/a>, so the same Key-Value pair capabilities are available for TCP\/UDP applications. <\/p>\n<p>Dynamically reconfiguring the Key-Value store in the stream context is implemented in NGINX Plus R14 as part of the <a href=\"https:\/\/www.nginx.com\/blog\/nginx-plus-r13-released\/#r13-api\" rel=\"noopener\" target=\"_blank\">NGINX Plus API<\/a>.<\/p>\n<p><strong>Note<\/strong>: The Key-Value store and API are exclusive to NGINX Plus.<\/p>\n<h3 id=\"nginscript\">nginScript Enhancements<\/h3>\n<p>nginScript is a JavaScript-based scripting language for NGINX Plus. In NGINX Plus R14, the capabilities of nginScript have been extended to further improve programmability. An updated dynamic module package for nginScript now provides the following new enhancements.<\/p>\n<h4>JSON Object Support<\/h4>\n<p>The JavaScript JSON object is now available as a native object in nginScript. This provides a more convenient way of managing complex data structures, and also allows nginScript to parse and manipulate JSON responses received from backend APIs.<\/p>\n<p>The nginScript shell example below demonstrates how to parse and extract JSON data using built-in object syntax. <\/p>\n<pre><code class=\"terminal\">$ njs<br \/>\ninteractive njscript<\/p>\n<p>v. -&gt; the properties and prototype methods of v.<br \/>\ntype console.help() for more information<\/p>\n<p>&gt;&gt; var my_data = '{\"colors\":[{\"name\":\"red\",\"fancy\":\"brick dust\"}, {\"name\":\"blue\",\"fancy\":\"sea spray\"}]}';<br \/>\n&gt;&gt; var my_object = JSON.parse(my_data);<br \/>\n&gt;&gt; my_object.colors[1].fancy;<br \/>\nsea spray<br \/>\n&gt;&gt;<\/pre>\n<p><\/code><\/p>\n<h4>Filesystem Access<\/h4>\n<p>Node.js, the most popular server-side JavaScript implementation, provides built-in methods to <a href=\"https:\/\/nodejs.org\/api\/fs.html#fs_file_system\" rel=\"noopener\" target=\"_blank\">access the OS filesystem<\/a> (client-side JavaScript doesn\u2019t allow filesystem access). With NGINX Plus R14, Node.js filesystem methods can now be used in nginScript to read and write files, allowing you to customize your application delivery workflow. The following operations are permitted: <\/p>\n<ul>\n<li>Read: fs.readFile, fs.readFileSync<\/li>\n<li>Write: fs.writeFile, fs.writeFileSync<\/li>\n<li>Append: fs.appendFile, fs.appendFileSync<\/li>\n<\/ul>\n<p>This nginScript shell example shows how nginScript can be used to read file contents into a variable. <\/p>\n<pre><code class=\"terminal\">$ njs<br \/>\ninteractive njscript<\/p>\n<p>v. -&gt; the properties and prototype methods of v.<br \/>\ntype console.help() for more information<\/p>\n<p>&gt;&gt; var fs = require('fs');<br \/>\n&gt;&gt; var tz = fs.readFileSync('\/etc\/timezone', function(e) {if (e) {data = e;} });<br \/>\n&gt;&gt; tz<br \/>\nEurope\/London<\/pre>\n<p><\/code><\/p>\n<h4>Error Objects and Backtraces<\/h4>\n<p>To further help developers with debugging and troubleshooting, a wide range of error objects is now available: <\/p>\n<p><code>Error, EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError<\/code><\/p>\n<p>Additionally, nginScript now provides backtraces for errors and exceptions. The following entry from the error log shows a simple backtrace for a failed system operation. <\/p>\n<pre><code class=\"config\">2017\/12\/12 01:52:08 [error] 43441#43441: *10 js exception: Error: No such file or directory<br \/>\n    at native (native)<br \/>\n    at my_function (:1)<br \/>\n    at main (native)<br \/>\n, client: 127.0.0.1, server: , request: \"GET \/ HTTP\/1.1\", host: \"localhost:80\"<\/pre>\n<p><\/code><\/p>\n<p>Learn how to <a href=\"https:\/\/www.nginx.com\/blog\/introduction-nginscript\/\">get started with nginScript<\/a> in our introductory blog post. <\/p>\n<h3 id=\"dashboard\">NGINX Plus Dashboard for the New NGINX Plus API<\/h3>\n<p><a href=\"https:\/\/www.nginx.com\/blog\/nginx-plus-r13-released\/\">NGINX Plus R13<\/a> introduced the <a href=\"https:\/\/www.nginx.com\/blog\/nginx-plus-r13-released\/#r13-api\">NGINX Plus API<\/a>, allowing users to have access to real-time monitoring and metrics in a JSON format. In NGINX Plus R14, a new <a href=\"https:\/\/demo.nginx.com\/\">NGINX Plus dashboard<\/a> is included that uses this API. This new dashboard uses the NGINX Plus API extended status functionality to provide more than 80 monitoring metrics to the user in real time. <\/p>\n<p>The old APIs used by dashboards in previous versions of NGINX Plus are deprecated. They will continue to be shipped with NGINX Plus in this release, R14, and the next release, R15. The old dashboard and deprecated APIs will then be removed with NGINX Plus R16. <\/p>\n<p>Configuration for the existing NGINX Plus dashboard looks like this:<\/p>\n<pre><code class=\"config\">    location \/status {<br \/>\n        status;<br \/>\n    }<br \/>\n    location = \/status.html {<br \/>\n        root \/usr\/share\/nginx\/html;<br \/>\n    }<\/pre>\n<p><\/code><\/p>\n<p>To migrate your existing NGINX Plus instances to the new NGINX Plus dashboard, replace your existing status locations with this:<\/p>\n<pre><code class=\"config\">    location \/api {<br \/>\n        api write=on;<br \/>\n    }<br \/>\n    location = \/dashboard.html {<br \/>\n        root \/usr\/share\/nginx\/html;<br \/>\n    }<\/p>\n<p>    # Catch users of old dashboard<br \/>\n    location = \/status.html {<br \/>\n        return 301 \/dashboard.html;<br \/>\n    }<\/pre>\n<p><\/code><\/p>\n<p>Remember to migrate all existing access controls from the <code>\/status<\/code> location to the <code>\/api<\/code> location. Examples include <code>allow<\/code> \/ <code>deny<\/code> directives and authentication controls.<\/p>\n<p>For more information about the new NGINX Plus API, please see the <a href=\"https:\/\/www.nginx.com\/blog\/nginx-plus-r13-released\/#r13-api\">NGINX Plus R13 announcement<\/a>.<\/p>\n<p><strong>Note<\/strong>: The NGINX Plus dashboard is exclusive to NGINX Plus.<\/p>\n<h3 id=\"drain\">Drain Upstream Server Directive (without API)<\/h3>\n<p>Before taking a server offline, we want to prevent new connections, then allow existing active sessions to complete, leaving no active sessions remaining. You can execute this functionality with the NGINX Plus API by putting upstream servers into \u201cdraining\u201d mode. To do this, send a PATCH request to the API resource for the relevant server, with <code>{\"drain\":true}<\/code>. <\/p>\n<p>NGINX Plus R14 extends this functionality to file-based configuration by providing a <code>drain<\/code> parameter to the <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_upstream_module.html#server\" rel=\"noopener\" target=\"_blank\">upstream server directive<\/a>. <\/p>\n<pre><code class=\"config\">upstream my_backend {<br \/>\n        server  10.0.0.1;<br \/>\n        server  10.0.0.2;<br \/>\n        server  10.0.0.3 drain;<br \/>\n}<br \/>\n<\/pre>\n<p><\/code><\/p>\n<p>After reloading the NGINX configuration, the upstream server with IP 10.0.0.3 will be in draining mode. The configuration can later be modified to remove the third of the three <code>server<\/code> directives completely.<\/p>\n<h3 id=\"clustersticky\">Clustering Support for Sticky Learn (Technology Preview)<\/h3>\n<p>With NGINX Plus R14, we\u2019re pleased to announce a technology preview of a forthcoming capability for state sharing across a cluster of NGINX Plus instances. The <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_upstream_module.html#sticky_learn\" rel=\"noopener\" target=\"_blank\">sticky learn<\/a> method of session affinity is implemented to demonstrate the benefits of distributing session data that would otherwise be individually managed by each instance.<\/p>\n<p>Support for sticky learn is provided as a technology preview. The technology preview is provided as a separate installable package and is available on request. Please contact your NGINX sales representative for access. <\/p>\n<p><strong>Notes:<\/strong> <\/p>\n<ol>\n<li>The sticky learn clustering functionality is in preview status and as such is not suitable for use in production. If state sharing across a cluster is an important requirement for your environment then we encourage you to test the technology preview and provide feedback to NGINX on how well it meets your needs. <\/li>\n<li>Technology preview packages are available for CentOS\/RHEL 7, Debian 8\/9, and Ubuntu 16.04, 16.10, 17.10.<\/li>\n<\/ol>\n<p><strong>Note<\/strong>: Clustering support and sticky learn session affinity are both exclusive to NGINX Plus.<\/p>\n<h3 id=\"additional\">Additional Features<\/h3>\n<p>NGINX Plus R14 also includes the following enhancements:<\/p>\n<ul>\n<li>Resolver state persistence across reloads&nbsp;&ndash; Saves your list of upstream DNS records when reloading NGINX Plus so no request will find an empty list of upstream IP addresses.<\/li>\n<li>New SSL client certificate variable&nbsp;&ndash; The variable $ssl_client_escaped_cert is a new embedded NGINX variable providing you a safe and convenient way to encode your client certificates in an HTTP header so you can send them to your backend applications. The variable is URL-encoded.<\/li>\n<\/ul>\n<h2>Upgrade or Try NGINX Plus<\/h2>\n<p>NGINX Plus R14 includes improved authentication capabilities for your client applications, additional clustering capabilities, nginScript enhancements, and <a href=\"http:\/\/nginx.org\/en\/CHANGES\" rel=\"noopener\" target=\"_blank\">notable bug fixes<\/a>. In particular, NGINX Plus R13 introduced a bug for active health checks whereby an old worker process might perform health checks indefinitely. This has been resolved with NGINX Plus R14.<\/p>\n<p>If you\u2019re running NGINX Plus, we strongly encourage you to upgrade to Release 14 as soon as possible. You\u2019ll pick up a number of fixes and improvements, and upgrading will help NGINX to help you when you need to raise a support ticket. <\/p>\n<p>Please carefully review the new features and changes in behavior described in this blog post before proceeding with the upgrade.<\/p>\n<p>If you haven\u2019t tried <a href=\"https:\/\/www.nginx.com\/products\/\" rel=\"noopener\" target=\"_blank\">NGINX Plus<\/a>, we encourage you to try it out&nbsp;&ndash; for web acceleration, load balancing, and application delivery, or as a fully supported web server with enhanced monitoring and management APIs. You can get started for free today with a <a href=\"https:\/\/www.nginx.com\/free-trial-request\/\">30-day evaluation<\/a>. See for yourself how NGINX Plus can help you deliver and scale your applications. <\/p>\n<p>The post <a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/nginx-plus-r14-released\/\">Announcing NGINX Plus R14<\/a> appeared first on <a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\">NGINX<\/a>.<\/p>\n<p>Source: <a href=\"https:\/\/www.nginx.com\/blog\/nginx-plus-r14-released\/\" target=\"_blank\">Announcing NGINX Plus R14<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Announcing NGINX Plus R14 We&#8217;re pleased to announce that NGINX Plus R14 is now available to our NGINX Plus subscribers. NGINX Plus is the only all-in-one load balancer, content cache, and web server. NGINX Plus R14 is based on the open source NGINX software and previous NGINX Plus releases. The new release also includes authentication and clustering enhancements, additional features, bug fixes, and our award-winning 24-hour support. With NGINX Plus R14, you can enforce access controls using JSON web tokens (JWT). With new support for nested JWT claims, NGINX Plus can allow or grant access based on group membership information nested inside a JWT. Native JWT authentication support, first introduced in NGINX Plus R10, enables NGINX Plus to be used as an authentication gateway for your APIs and applications. Additional NGINX Plus R14 features include: Extended clustering support (technology preview)&nbsp;&ndash; <a class=\"mh-excerpt-more\" href=\"https:\/\/jirak.net\/wp\/announcing-nginx-plus-r14\/\" title=\"Announcing NGINX Plus R14\">[ more&#8230; ]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[169],"tags":[652],"class_list":["post-21147","post","type-post","status-publish","format-standard","hentry","category-news","tag-nginx"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/21147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/comments?post=21147"}],"version-history":[{"count":1,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/21147\/revisions"}],"predecessor-version":[{"id":21148,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/21147\/revisions\/21148"}],"wp:attachment":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/media?parent=21147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/categories?post=21147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/tags?post=21147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}