Getting started
Starting with NGINX Plus R33, NGINX Plus instances require a valid JSON Web Token (JWT) license.
The license:
- Is tied to your subscription (not to individual instances).
- Checks your subscription and reports usage either to F5’s licensing endpoint (
product.connect.nginx.com
) or, in disconnected environments, through NGINX Instance Manager.
If you have multiple subscriptions, you’ll also have multiple JWT licenses. You can assign each NGINX Plus instance to the license you prefer. NGINX combines usage reporting across all licensed instances.
Combining licenses with NGINX Instance Manager requires version 2.20 or later.
NGINX Plus requires a valid license and regular usage reporting to run. The sections below explain the requirements and what happens if they aren’t met.
For flowcharts that show how these requirements work in practice, see NGINX Plus licensing workflows.
Starting NGINX Plus requires:
- A valid license.
- A license that has not been expired for more than 90 days.
Processing traffic requires:
- A successful initial usage report. If the initial report isn’t sent, NGINX Plus won’t process traffic until the report is sent successfully. To add a grace period, see Postpone reporting enforcement.
- Ongoing usage reports, at least every 180 days. If reporting stops, NGINX Plus keeps running but stops processing traffic once 180 days have passed without a report. To avoid disruption, send usage reports regularly instead of waiting until the 180-day cutoff.
- Log in to MyF5.
- Go to My Products & Plans > Subscriptions to see your active subscriptions.
- Find your NGINX subscription, and select the Subscription ID for details.
- Download the JSON Web Token file from the subscription page.
After you download the JWT license, deploy it to your NGINX Plus instances in one of two ways:
- Use a group sync feature (recommended):
- In the NGINX One Console, use a Config Sync Group to keep instances consistent, avoid manual copying, and apply license updates automatically.
- In NGINX Instance Manager, use an instance group, which works the same way as a Config Sync Group.
- Copy the license manually: Place the license file on each NGINX Plus instance yourself.
Both methods ensure your NGINX Plus instances have access to the required license file.
Choose the option that fits your environment:
Deploy with a group sync feature (recommended)
Before you deploy with a Config Sync Group, you need to create one in the NGINX One Console.
If you haven’t created a group yet, see Manage Config Sync Groups for instructions.
-
In the NGINX One Console, go to Manage > Config Sync Groups, then select your group.
-
Open the Configuration tab and select Edit Configuration.
-
Select Add File, then choose New Configuration File.
-
In the File name field, enter the exact path:
- On Linux:
/etc/nginx/license.jwt
- On FreeBSD:
/usr/local/etc/nginx/license.jwt
- On Linux:
-
Paste the contents of your JWT license file into the editor.
-
Select Next to preview the changes, then choose Save and Publish to apply the update.
In NGINX Instance Manager, instance groups provide the same sync functionality as Config Sync Groups in the NGINX One Console.
See Manage instance groups for setup instructions.
Deploy manually
Copy the JWT license file to each NGINX Plus instance.
-
Copy the license file to:
/etc/nginx/license.jwt
on Linux/usr/local/etc/nginx/license.jwt
on FreeBSD
-
Reload NGINX:
systemctl reload nginx
-
If SELinux is enabled, set the correct file context so NGINX can read the license:
chcon -t httpd_config_t /etc/nginx/license.jwt
Use custom paths
If you’re upgrading from NGINX Plus R32 or earlier to R33 or later and plan to use a custom path for the license file, note that the custom path isn’t recognized until after the upgrade. You must first create a placeholder file at /etc/nginx/license.jwt
(or /usr/local/etc/nginx/license.jwt
on FreeBSD).
-
Before upgrading: Create the placeholder file:
touch /etc/nginx/license.jwt
-
After upgrading: Update the
license_token
directive in themgmt
block of the configuration to point to your custom path:nginxmgmt { license_token <custom_path>; }
NGINX Plus R33 and later must send usage reports.
Choose the setup steps that match your environment:
Configure reporting in internet-connected environments
In connected environments, NGINX Plus sends usage reports directly to the F5 licensing endpoint.
Allow the necessary outbound traffic so reports can reach F5.
-
Allow NGINX Plus instances to connect to the F5 licensing endpoint (
product.connect.nginx.com
) over HTTPS (TCP443
). Make sure the following IP addresses are allowed:3.135.72.139
3.133.232.50
52.14.85.249
-
(R34 and later) If your company restricts outbound traffic, configure NGINX Plus instances to connect through an outbound proxy. Update the
proxy
directive in themgmt
block of (/etc/nginx/nginx.conf
) to point to your proxy server:nginxmgmt { proxy PROXY_ADDR:PORT; # can be http or https proxy_username USER; # optional proxy_password PASS; # optional }
Configure reporting in network-restricted environments
In environments without internet access, NGINX Plus sends usage reports to NGINX Instance Manager. NGINX Instance Manager collects the reports and later forwards them to F5.
To configure NGINX Plus to send usage reports to NGINX Instance Manager:
-
Allow NGINX Plus instances to connect to NGINX Instance Manager over HTTPS (TCP
443
). -
On each NGINX Plus instance, set the
usage_report
directive in themgmt
block of/etc/nginx/nginx.conf
to point to your NGINX Instance Manager host:nginxmgmt { usage_report endpoint=<NGINX-INSTANCE-MANAGER-FQDN>; }
-
Reload NGINX:
systemctl reload nginx
If you’re using self-signed certificates with NGINX Instance Manager,
see Configure SSL verification for self-signed certificates for additional steps.
For instructions on forwarding usage reports from NGINX Instance Manager to F5, see Report usage data to F5 (disconnected).
By default, NGINX Plus requires a successful initial usage report before it continues processing traffic.
If you need to delay this requirement, you can set enforce_initial_report
to off
. This starts a 180-day grace period where NGINX Plus keeps running while it continues trying to report.
# Modify this directive to start the 180-day grace period for initial reporting.
mgmt {
enforce_initial_report off;
}
ImportantAfter 180 days, if usage reporting still hasn’t been established, NGINX Plus will stop processing traffic.
How you update the JWT license depends on your NGINX Plus release and environment:
- In R35 and later, the license is updated automatically when the subscription renews (if reporting is configured).
- In earlier releases or disconnected environments, you need to update the license manually.
Update the license automatically (R35 and later)
Starting in NGINX Plus R35, JWT licenses are updated automatically for instances that report directly to the F5 licensing endpoint. NGINX Plus downloads the new license and applies it without requiring a reload or restart.
Here’s how the automatic update works:
- Beginning 30 days before the current license expires, NGINX Plus notifies the licensing endpoint as part of usage reporting.
- The licensing endpoint checks for a renewed subscription with F5.
- After the subscription is renewed, the licensing endpoint sends the updated JWT license to the instance.
- NGINX Plus applies the updated license automatically and stores it as nginx-mgmt-license in the
state_path
directory. - The original JWT license file at
/etc/nginx/license.jwt
(or a custom path set bylicense_token
) is not modified. You can replace the original file manually if needed, but this does not affect NGINX Plus operation. - This process also applies if the license has already expired but is still within the 90-day grace period.
- Traffic continues without interruption.
ImportantAutomatic updates only work if:
- License reporting is configured, and
- At least one usage report has already been sent successfully.
If these conditions aren’t met, you must update the JWT license manually.
Update the license manually (all releases)
If automatic updates are not available (for example, in disconnected environments), update the license manually:
- Download the new JWT license from MyF5.
- Deploy the JWT license to your NGINX Plus instances.
Monitor the NGINX error log, usually at /var/log/nginx/error.log
, to identify subscription issues early. The log records problems such as failed usage reports or licenses that are about to expire. Check it regularly to avoid downtime and stay compliant.
You can also use the license API endpoint to check license status programmatically. For details, see the ngx_http_api_module docs.
Examples of log entries:
-
Failed usage reports:
text[error] 36387#36387: server returned 500 for <fqdn>:<port> during usage report [error] 36528#36528: <fqdn>:<port> could not be resolved (host not found) during usage report [error] 36619#36619: connect() failed (111: Connection refused) for <fqdn>:<port> during usage report [error] 38888#88: server returned 401 for <ip_address>:443 during usage report
-
License nearing expiration:
[warn] license will expire in 14 days
-
License expired:
text[alert] license expiry; grace period will end in 89 days [emerg] license expired
ImportantNGINX Plus stops processing traffic if the license has been expired for more than 90 days.
By default, NGINX Plus sends usage data to F5 every hour in a POST
request. The report includes information such as traffic volume, runtime, and instance activity.
Here’s an example of a usage report:
{
"version": "<nginx_version>",
"uuid": "<nginx_uuid>",
"nap": "<active/inactive>", // NGINX App Protect status
"http": {
"client": {
"received": 0, // bytes received
"sent": 0, // bytes sent
"requests": 0 // HTTP requests processed
},
"upstream": {
"received": 0, // bytes received
"sent": 0 // bytes sent
}
},
"stream": {
"client": {
"received": 0, // bytes received
"sent": 0 // bytes sent
},
"upstream": {
"received": 0, // bytes received
"sent": 0 // bytes sent
}
},
"workers": 0, // number of worker processes running
"uptime": 0, // seconds the instance has been running
"reloads": 0, // number of reloads
"start_time": "epoch", // start of data collection
"end_time": "epoch" // end of data collection
}
- Watch instructional videos on how to upgrade to R33 or later, and how to submit usage reports