- Review syntax, directive context, references, and risky patterns in the IDE.
- Run
nginx -tagainst the same files and Nginx build used in deployment. - Exercise changed routes in a local container or staging environment.
- Reload gradually, inspect logs and metrics, and keep a rollback ready.
What nginx -t actually checks
The native configuration test is the non-negotiable baseline. According to the official Nginx command-line documentation, -t checks configuration syntax and tries to open files referenced by the configuration. A successful result tells you that the selected Nginx binary can parse the config and access those dependencies.
sudo nginx -t
sudo nginx -T > /tmp/nginx-expanded.conf-T performs the same test and prints the expanded configuration. It is useful when a root file pulls in several include trees and you need to review what Nginx actually saw. In automation, add -q when you only want error output.
nginx -t does not send requests through your routing rules, confirm that the intended upstream is healthy, or prove that a security policy does what you expect. It also uses the modules, paths, permissions, DNS, and environment available where the command runs.
A four-layer validation workflow
1. Catch local mistakes while the change is still in context
Start in the editor. Check directive spelling and allowed context, follow every changed include, navigate to referenced upstreams and named locations, and inspect variables before leaving the diff. This is the cheapest point to catch a typo or a reference that no longer resolves.
The free Nginx Configuration plugin covers file recognition, highlighting, folding, structure view, and basic completion. Pro adds context-aware completion, cross-file navigation, refactoring, deeper inspections, and security analysis. Neither edition replaces the runtime check.
2. Test the deployment-shaped configuration
Run the command with an explicit config when the repository file is not the system default. Use the same Nginx edition, version, and dynamic modules as production whenever possible.
nginx -t -c /workspace/nginx/nginx.conf
docker run --rm \
-v "$PWD/nginx.conf:/etc/nginx/nginx.conf:ro" \
-v "$PWD/conf.d:/etc/nginx/conf.d:ro" \
nginx:1.29-alpine nginx -tMount every referenced file, certificate, and directory required by the test. A container is valuable only when it resembles the real image; a different Nginx build can accept or reject a different set of directives.
3. Exercise behavior, not just parsing
Start the tested config locally or in staging and send representative requests. Cover the changed hostname, path, method, headers, redirects, cache behavior, error handling, and upstream failure mode. For location changes, include neighboring paths that should not match.
curl -i -H 'Host: api.example.test' http://127.0.0.1:8080/health
curl -i -H 'Host: api.example.test' http://127.0.0.1:8080/api/users
curl -i -X OPTIONS -H 'Origin: https://app.example.test' \
http://127.0.0.1:8080/api/usersAssertions should check status, important headers, redirect destinations, and a small amount of response content. A bare “the request completed” is too weak for a routing or security change.
4. Reload with an observable rollback path
Only reload after the static and behavioral checks pass. Nginx documents nginx -s reload as the signal that starts new workers with the new configuration and gracefully shuts down the old workers. Your rollout still needs health checks, error-rate monitoring, and a known-good config that can be restored quickly.
Common reasons a local pass fails in deployment
| Difference | Typical symptom | Control |
|---|---|---|
| Nginx version or modules | Unknown directive | Test the production image or exact package build |
| Include paths | File not found | Expand with -T and test explicit mounts |
| Permissions | Certificate, key, PID, or log access failure | Run with deployment-equivalent user and filesystem access |
| Environment substitution | Empty or malformed values | Render the final file, then test the rendered artifact |
| DNS and upstreams | Runtime 502 or delayed startup failure | Exercise requests in the target network |
Where IDE inspections add value
Native validation is intentionally focused on loading the configuration. An IDE can provide a different layer: immediate feedback on the edited line, navigation through a multi-file config, refactoring across usages, and warnings for patterns that are syntactically valid but risky. That shortens the loop before the runtime test; it does not make the runtime test optional.
Inspect Nginx Configuration Pro and start the 14-day trial →