Pruebas de Configuración de Nginx: Asegurando Despliegues Fluidos con Comandos Clave
Usa nginx -t, nginx -T y hábitos seguros de recarga para detectar errores de configuración de Nginx antes de que afecten el tráfico.
Pruebas de Configuración de Nginx: Asegurando Despliegues Fluidos con Comandos Clave
Las pruebas de configuración de Nginx son uno de esos hábitos que parecen demasiado pequeños para importar hasta que te salvan de una recarga rota. Un punto y coma faltante, una ruta de inclusión incorrecta o una directiva de un módulo que no tienes pueden impedir que Nginx acepte una nueva configuración. En un proxy inverso de producción, eso no es un error pequeño.
El comando principal es simple:
sudo nginx -t
Ejecútalo antes de cada recarga. Ejecútalo después de editar un bloque de servidor. Ejecútalo en CI si tu equipo almacena la configuración de Nginx en Git. El comando analiza la configuración e informa si la sintaxis es válida. No prueba que tu lógica de enrutamiento sea correcta, que tu certificado TLS sea válido para cada nombre de host o que tu aplicación upstream esté saludable. Detecta el tipo de errores que Nginx puede identificar antes de aplicar la configuración.
Qué verifica nginx -t
nginx -t le dice a Nginx que pruebe la configuración. Lee el archivo de configuración principal, sigue las directivas include, analiza directivas y bloques, y verifica muchos problemas de archivos/rutas. Una ejecución exitosa generalmente se ve así:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Una ejecución fallida señala un archivo y un número de línea:
nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/api.conf:18
nginx: configuration file /etc/nginx/nginx.conf test failed
El número de línea es donde el analizador notó el problema, no siempre donde cometiste el error. Si Nginx dice que aparece un } inesperado en la línea 18, revisa las líneas anteriores en busca de un punto y coma faltante o un bloque no cerrado.
Usa sudo cuando los archivos de configuración, archivos de certificado o fragmentos incluidos sean legibles solo por root:
sudo nginx -t
Sin los permisos correctos, tu prueba puede fallar aunque la sintaxis sea correcta.
Usa nginx -T cuando las inclusiones dificultan ver la configuración
Muchas configuraciones de Nginx dividen la configuración entre /etc/nginx/nginx.conf, conf.d/*.conf, sites-enabled/* y fragmentos compartidos. Esto es bueno para el mantenimiento, pero puede hacer que la depuración sea confusa.
nginx -T prueba la configuración e imprime la configuración completa analizada en stdout:
sudo nginx -T
Esto es útil cuando necesitas responder preguntas como:
- ¿Qué archivo define realmente este bloque de servidor?
- ¿Mi patrón
includerecogió un archivo de respaldo? - ¿Esta directiva se está configurando en el ámbito
http,serverolocation? - ¿Qué bloque
server_nameduplicado está ganando?
Ten cuidado al compartir la salida de nginx -T. Puede incluir rutas de certificados, nombres de host internos, nombres de upstream, encabezados o comentarios con contexto sensible. Para un ticket, redacta antes de pegar.
Prueba un archivo de configuración no predeterminado con -c
Si estás construyendo una configuración en una ruta de staging, usa -c:
sudo nginx -t -c /home/deploy/nginx-staging/nginx.conf
Esto le dice a Nginx qué archivo de configuración principal probar. Las rutas relativas dentro de esa configuración pueden comportarse de manera diferente según la configuración de prefijo, así que mantén las pruebas de staging cerca del diseño de producción cuando sea posible.
También puedes inspeccionar las rutas de compilación y los módulos con:
nginx -V
La salida va a stderr en muchos sistemas, lo que sorprende a las personas al redirigir la salida. Muestra la versión de Nginx y las opciones de compilación, incluido el soporte de módulos y las rutas predeterminadas. Esto importa cuando una configuración usa directivas de módulos como http_v2, realip, stub_status o proxy de flujo.
Recarga, no reinicies sin cuidado
Una vez que la prueba pase, recarga Nginx:
sudo systemctl reload nginx
Una recarga le pide al proceso maestro que lea la nueva configuración e inicie nuevos workers mientras los workers antiguos terminan las solicitudes existentes. Ese es el camino normal para los cambios de configuración.
Un reinicio detiene e inicia el servicio:
sudo systemctl restart nginx
Usa el reinicio cuando realmente lo necesites, como después de cambios de paquetes o un problema de estado del servicio. Para ediciones de configuración ordinarias, la recarga es menos disruptiva.
Algunos archivos de unidad systemd ejecutan una prueba de configuración como parte de la recarga. No confíes en eso como tu única red de seguridad. Ejecuta nginx -t tú mismo primero para ver el error antes de tocar el servicio en ejecución.
El comando de señal nativo de Nginx también es común:
sudo nginx -s reload
En servidores administrados por systemd, normalmente prefiero systemctl reload nginx porque mantiene el estado del servicio y los registros en la misma capa de gestión.
Un flujo de trabajo de edición seguro
Para un cambio normal de bloque de servidor, usa este ritmo:
sudo cp /etc/nginx/conf.d/api.conf /etc/nginx/conf.d/api.conf.bak.$(date +%Y%m%d%H%M%S)
sudoedit /etc/nginx/conf.d/api.conf
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx --no-pager
Si tu configuración está en Git, confirma el cambio en lugar de mantener archivos de respaldo aleatorios para siempre. El comando de respaldo anterior es útil para servidores pequeños no administrados, no un reemplazo para el control de versiones.
Después de la recarga, prueba la ruta real:
curl -I https://example.com/api/health
curl -I -H 'Host: example.com' http://127.0.0.1/
nginx -t puede decirte que la configuración se analiza. curl te dice si el sitio se comporta como pretendías.
Mensajes de error comunes y lo que suelen significar
Un punto y coma faltante a menudo se ve así:
nginx: [emerg] invalid number of arguments in "proxy_set_header" directive in /etc/nginx/conf.d/app.conf:22
Revisa la directiva en esa línea y la anterior. Las directivas de Nginx generalmente terminan con ;, mientras que los bloques terminan con { ... }.
Una ruta de inclusión incorrecta se ve así:
nginx: [emerg] open() "/etc/nginx/snippets/security-headers.conf" failed (2: No such file or directory)
O la ruta del archivo es incorrecta, el fragmento no se implementó o el patrón de inclusión es específico del entorno.
Un problema de permisos puede verse así:
nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/example.com/fullchain.pem": BIO_new_file() failed
El archivo puede faltar, el enlace simbólico puede estar roto o el usuario que ejecuta la prueba no puede leerlo. Los scripts de renovación e implementación de certificados son lugares comunes donde esto ocurre.
Una directiva desconocida significa una de tres cosas: error tipográfico, contexto incorrecto o módulo faltante.
nginx: [emerg] unknown directive "proxy_cache_purge"
Quizás el nombre de la directiva es incorrecto. Quizás pertenece a un módulo diferente. Quizás tu compilación de Nginx de producción no incluye el módulo de terceros que existía en staging. Verifica nginx -V antes de asumir que la configuración es portátil.
Un nombre de servidor duplicado o conflictivo puede aparecer como una advertencia en lugar de un error grave:
nginx: [warn] conflicting server name "example.com" on 0.0.0.0:80, ignored
No ignores las advertencias solo porque la línea final dice que la prueba fue exitosa. Una advertencia puede significar que Nginx no usará el bloque de servidor que crees que usará.
Pruebas en CI
Si la configuración de Nginx vive en un repositorio, pruébala antes de la implementación. Una verificación simple basada en contenedores puede montar la configuración en una imagen de Nginx y ejecutar:
nginx -t -c /etc/nginx/nginx.conf
La parte difícil es igualar las rutas de producción. Si tu configuración hace referencia a /etc/letsencrypt, las pruebas locales necesitan archivos de marcador de posición o una configuración específica para pruebas. Si hace referencia a nombres de host upstream, la prueba de sintaxis no necesita que el upstream esté activo, pero los archivos incluidos y los archivos de certificado deben existir.
Para equipos con muchos sitios, agrega un paso previo a la implementación que ejecute nginx -T y almacene la salida sanitizada como un artefacto. Cuando una recarga se comporta de manera extraña, puedes comparar la configuración renderizada de la última implementación buena con la actual.
Lo que las pruebas de configuración no pueden detectar
nginx -t no te dirá que tu nuevo bloque location está sombreado por otra ubicación regex. No sabrá que tu aplicación upstream devuelve 500. No probará que una cadena de redireccionamiento sea sensata o que una regla de caché sea segura.
Para eso, agrega verificaciones de comportamiento:
curl -I https://example.com/
curl -I https://example.com/old-path
curl -sS https://example.com/api/health
Para cambios TLS, verifica el certificado desde el punto de vista del cliente:
openssl s_client -connect example.com:443 -servername example.com </dev/null
Para cambios de proxy inverso, observa los registros durante y después de la recarga:
sudo tail -f /var/log/nginx/error.log /var/log/nginx/access.log
Las pruebas de configuración de Nginx no son una estrategia de implementación completa, pero son la puerta que toda estrategia debería incluir. Usa nginx -t para la sintaxis, nginx -T para la depuración de configuración renderizada, nginx -V para detalles de compilación y systemctl reload nginx para cambios normales. Luego verifica el comportamiento con solicitudes reales.