Nginx Access Logs : Signification des champs et analyse
Les logs d'accès Nginx enregistrent chaque requête traitée par votre serveur web. C'est le premier endroit à consulter pour déboguer des 404, traquer des endpoints lents ou investiguer du trafic suspect. Pourtant, beaucoup de développeurs survolent les lignes brutes sans comprendre chaque champ. Ce guide détaille le format de log Nginx par défaut, montre comment le personnaliser et présente des techniques d'analyse pratiques avec les outils en ligne de commande standards.
Format de log d'accès Nginx par défaut
Par défaut, Nginx utilise le format combined, qui ressemble à ceci :
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Une ligne de log typique :
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"
Explication champ par champ
| Champ | Variable | Description |
|---|---|---|
| Adresse distante | $remote_addr | Adresse IP du client effectuant la requête. |
| Utilisateur distant | $remote_user | Nom d'utilisateur si l'authentification HTTP est utilisée ; sinon -. |
| Heure locale | $time_local | Heure locale du serveur au format [jour/mois/année:heure:minute:seconde zone]. |
| Requête | $request | Ligne de requête complète : méthode, chemin et protocole HTTP. |
| Statut | $status | Code de statut de la réponse HTTP (ex. 200, 404, 500). |
| Octets du corps envoyés | $body_bytes_sent | Taille du corps de la réponse en octets, en-têtes exclus. |
| Referer | $http_referer | La page ayant mené à la requête (si fournie par le client). |
| User agent | $http_user_agent | Chaîne du logiciel client (navigateur, bot, outil). |
Personnaliser le format de log
Vous pouvez définir votre propre format pour capturer des détails supplémentaires comme le temps de requête, le temps de réponse upstream ou le ratio gzip. Ajoutez une directive log_format dans le bloc http et référencez-la dans 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 supplémentaires courantes :
$request_time– temps total entre le premier octet reçu et le dernier octet envoyé.$upstream_response_time– temps passé à attendre l'upstream (ex. PHP-FPM, Node.js).$gzip_ratio– ratio de compression si gzip est activé.$http_x_forwarded_for– IP client originale derrière un proxy ou load balancer.
Analyser les logs Nginx avec les outils en ligne de commande
Pas besoin de logiciels coûteux pour extraire des informations. Les outils Unix standards comme grep, awk, sort et uniq suffisent pour la plupart des tâches.
1. Trouver les adresses IP les plus fréquentes
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Cela aide à identifier les gros consommateurs ou de potentielles sources de DDoS.
2. Identifier les URLs les plus demandées
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Utile pour comprendre le contenu populaire ou repérer des schémas inhabituels.
3. Compter les codes de statut HTTP
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
Voyez rapidement combien de 404 ou 500 se produisent.
4. Trouver les requêtes avec des temps de réponse lents
Si vous avez ajouté $request_time à votre format de log, vous pouvez filtrer les requêtes lentes :
awk '{ if ($NF > 1) print }' /var/log/nginx/access.log
Ajustez le seuil (1 seconde ici) selon vos besoins.
5. Détecter les user agents suspects
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Repérez les bots malveillants connus ou les clients inhabituels.
Cas d'usage concrets
- Dépannage : Corrélez les erreurs 500 avec des endpoints spécifiques ou des temps de réponse upstream.
- Optimisation des performances : Identifiez les pages lentes et optimisez les requêtes de base de données ou le cache.
- Surveillance de sécurité : Repérez les tentatives de force brute (nombreux 401/403 depuis la même IP) ou les motifs d'injection SQL dans les URLs.
- Planification de capacité : Suivez le volume de requêtes dans le temps pour anticiper vos besoins de scaling.
Automatiser l'analyse avec des parseurs de logs
Bien que les one-liners en ligne de commande conviennent aux requêtes ponctuelles, un reporting régulier bénéficie d'outils dédiés. Vous pouvez utiliser des analyseurs de logs open source comme GoAccess ou AWStats, ou créer des scripts personnalisés. Pour un parsing rapide dans le navigateur sans rien installer, le Nginx Log Analyzer vous permet de coller des lignes de log et d'obtenir instantanément des synthèses des codes de statut, des IPs principales et des chemins demandés.
Bonnes pratiques pour la gestion des logs
- Rotation régulière des logs : Utilisez
logrotatepour éviter les problèmes d'espace disque. - Centralisez les logs : Acheminez-les vers un système de gestion de logs (ex. ELK, Graylog) pour le stockage et la recherche à long terme.
- Incluez des request IDs : Ajoutez
$request_idpour corréler avec les logs applicatifs. - Respectez la vie privée : Anonymisez les IPs si le RGPD ou d'autres réglementations l'exigent.
FAQ
Quelle est la différence entre les logs d'accès et les logs d'erreur dans Nginx ?
Les logs d'accès enregistrent chaque requête traitée par Nginx, incluant l'IP client, la méthode de requête, le code de statut et le user agent. Les logs d'erreur capturent les messages de diagnostic sur les problèmes serveur, comme les connexions échouées, les erreurs de configuration ou les timeouts upstream. Les deux sont essentiels pour différents scénarios de dépannage.
Comment voir la véritable IP client quand Nginx est derrière un load balancer ?
Quand Nginx se trouve derrière un proxy ou un load balancer, $remote_addr affiche l'IP du load balancer. Pour logger l'IP client originale, configurez le module real_ip pour faire confiance à l'IP du load balancer et utilisez $http_x_forwarded_for ou $realip_remote_addr dans votre format de log.
Puis-je analyser les logs Nginx sans installer de logiciel ?
Oui. Vous pouvez utiliser les commandes Unix standards comme grep, awk et sort directement dans le terminal. Pour une approche graphique dans le navigateur, des outils en ligne comme le Nginx Log Analyzer offrent des informations rapides sans aucune installation.
Prêt à plonger dans vos logs ? Essayez le Nginx Log Analyzer pour parser et visualiser vos logs d'accès en quelques secondes—aucune configuration requise.