Logs de acceso de Nginx: Qué significa cada campo y cómo analizarlos
Los logs de acceso de Nginx registran cada solicitud que maneja tu servidor web. Son el primer lugar donde buscar al depurar errores 404, rastrear endpoints lentos o investigar tráfico sospechoso. Sin embargo, muchos desarrolladores revisan las líneas de log sin comprender completamente cada campo. Esta guía desglosa el formato de log predeterminado de Nginx, muestra cómo personalizarlo y recorre técnicas prácticas de análisis usando herramientas estándar de línea de comandos.
Formato predeterminado del log de acceso de Nginx
De forma predeterminada, Nginx usa el formato de log combined, que se ve así:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Una línea de log típica:
192.0.2.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/users HTTP/1.1" 200 1234 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
Explicación campo por campo
| Campo | Variable | Descripción |
|---|---|---|
| Dirección remota | $remote_addr | Dirección IP del cliente que realiza la solicitud. |
| Usuario remoto | $remote_user | Nombre de usuario si se usa autenticación HTTP; de lo contrario, -. |
| Hora local | $time_local | Hora local del servidor en formato [día/mes/año:hora:minuto:segundo zona]. |
| Solicitud | $request | Línea completa de la solicitud: método, ruta y protocolo HTTP. |
| Estado | $status | Código de estado de respuesta HTTP (por ejemplo, 200, 404, 500). |
| Bytes del cuerpo enviados | $body_bytes_sent | Tamaño del cuerpo de la respuesta en bytes, excluyendo las cabeceras. |
| Referer | $http_referer | La página que enlazó a la solicitud (si la proporciona el cliente). |
| User agent | $http_user_agent | Cadena del software cliente (navegador, bot, herramienta). |
Personalizar el formato del log
Puedes definir tu propio formato para capturar detalles adicionales como el tiempo de solicitud, el tiempo de respuesta del upstream o la tasa de compresión gzip. Agrega una directiva log_format en el bloque http y referénciala en access_log.
http {
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log detailed;
}
Variables adicionales comunes:
$request_time– tiempo total desde el primer byte recibido hasta el último byte enviado.$upstream_response_time– tiempo de espera del upstream (por ejemplo, PHP-FPM, Node.js).$gzip_ratio– tasa de compresión si gzip está habilitado.$http_x_forwarded_for– IP original del cliente cuando está detrás de un proxy o balanceador de carga.
Analizar logs de Nginx con herramientas de línea de comandos
No necesitas software costoso para extraer información. Herramientas estándar de Unix como grep, awk, sort y uniq son suficientemente potentes para la mayoría de las tareas.
1. Encontrar las direcciones IP más frecuentes
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Esto ayuda a identificar clientes pesados o posibles fuentes de DDoS.
2. Identificar las URL más solicitadas
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Útil para entender el contenido popular o detectar patrones inusuales.
3. Contar códigos de estado HTTP
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
Ver rápidamente cuántos 404 o 500 están ocurriendo.
4. Encontrar solicitudes con tiempos de respuesta lentos
Si agregaste $request_time a tu formato de log, puedes filtrar solicitudes lentas:
awk '{ if ($NF > 1) print }' /var/log/nginx/access.log
Ajusta el umbral (1 segundo aquí) según sea necesario.
5. Detectar user agents sospechosos
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Busca bots maliciosos conocidos o clientes inusuales.
Casos de uso prácticos
- Solución de problemas: Correlaciona errores 500 con endpoints específicos o tiempos de respuesta del upstream.
- Ajuste de rendimiento: Identifica páginas lentas y optimiza consultas de base de datos o caché.
- Monitorización de seguridad: Detecta intentos de fuerza bruta (muchos 401/403 desde la misma IP) o patrones de inyección SQL en las URL.
- Planificación de capacidad: Rastrea el volumen de solicitudes a lo largo del tiempo para anticipar necesidades de escalado.
Automatizar el análisis con analizadores de logs
Si bien los comandos de una línea funcionan para consultas puntuales, los informes regulares se benefician de herramientas dedicadas. Puedes usar analizadores de logs de código abierto como GoAccess o AWStats, o crear scripts personalizados. Para un análisis rápido basado en navegador sin instalar nada, el Nginx Log Analyzer te permite pegar líneas de log y obtener resúmenes instantáneos de códigos de estado, IPs principales y rutas solicitadas.
Buenas prácticas para la gestión de logs
- Rota los logs regularmente: Usa
logrotatepara evitar problemas de espacio en disco. - Centraliza los logs: Envíalos a un sistema de gestión de logs (por ejemplo, ELK, Graylog) para almacenamiento y búsqueda a largo plazo.
- Incluye IDs de solicitud: Agrega
$request_idpara correlacionar con los logs de la aplicación. - Respeta la privacidad: Anonimiza las IPs si lo exigen el GDPR u otras regulaciones.
Preguntas frecuentes
¿Cuál es la diferencia entre los logs de acceso y los logs de error en Nginx?
Los logs de acceso registran cada solicitud manejada por Nginx, incluyendo la IP del cliente, el método de solicitud, el código de estado y el user agent. Los logs de error capturan mensajes de diagnóstico sobre problemas del servidor, como conexiones fallidas, errores de configuración o tiempos de espera del upstream. Ambos son esenciales para diferentes escenarios de solución de problemas.
¿Cómo puedo ver la IP real del cliente cuando Nginx está detrás de un balanceador de carga?
Cuando Nginx está detrás de un proxy o balanceador de carga, $remote_addr muestra la IP del balanceador. Para registrar la IP original del cliente, configura el módulo real_ip para confiar en la IP del balanceador y usa $http_x_forwarded_for o $realip_remote_addr en tu formato de log.
¿Puedo analizar logs de Nginx sin instalar software?
Sí. Puedes usar comandos estándar de Unix como grep, awk y sort directamente en la terminal. Para un enfoque gráfico basado en navegador, herramientas en línea como el Nginx Log Analyzer proporcionan información rápida sin ninguna instalación.
¿Listo para sumergirte en tus logs? Prueba el Nginx Log Analyzer para analizar y visualizar tus logs de acceso en segundos—sin configuración requerida.