Recherche de site Web

Comment configurer la journalisation et la rotation des journaux dans Nginx sur un VPS Ubuntu


Introduction

Pour vous épargner quelques problèmes avec votre serveur web, vous pouvez configurer la journalisation. La journalisation des informations sur votre serveur vous donne accès aux données qui vous aideront à résoudre les problèmes et à évaluer les situations au fur et à mesure qu'elles se présentent.

Dans ce tutoriel, vous examinerez les capacités de journalisation de Nginx et découvrirez comment configurer ces outils pour répondre au mieux à vos besoins. Vous utiliserez un serveur privé virtuel Ubuntu 22.04 comme exemple, mais toute distribution moderne devrait fonctionner de manière similaire.

Prérequis

Pour suivre ce tutoriel, vous aurez besoin de :

  • Un serveur Ubuntu 22.04 avec un utilisateur non root activé pour sudo et un pare-feu. Suivez notre guide de configuration initiale du serveur pour commencer.
  • Nginx installé sur le serveur. Suivez notre tutoriel Comment installer Nginx sur Ubuntu 22.04 pour l'installer.

Avec Nginx en fonctionnement sur votre serveur Ubuntu 22.04, vous êtes prêt à commencer.

Comprendre la directive Error_log

Nginx utilise quelques directives différentes pour contrôler la journalisation système. Celle incluse dans le module principal s'appelle error_log.

error_log Syntaxe

La directive error_log est utilisée pour gérer la journalisation des messages d'erreur généraux. Si vous connaissez Apache, cela ressemble beaucoup à la directive ErrorLog d’Apache.

La directive error_log utilise la syntaxe suivante :

error_log log_file log_level

Le log_file spécifie le fichier dans lequel les journaux seront écrits. Le log_level spécifie le niveau le plus bas de journalisation que vous souhaitez enregistrer.

Niveaux de journalisation

La directive error_log peut être configurée pour enregistrer plus ou moins d'informations selon les besoins. Le niveau de journalisation peut être l'un des suivants :

  • emerg : Situations d'urgence où le système est dans un état inutilisable.
  • alert : Situations graves nécessitant une action rapide.
  • crit : Problèmes importants qui doivent être abordés.
  • erreur : Une erreur s'est produite et quelque chose a échoué.
  • warn : Quelque chose d'inhabituel s'est produit, mais ce n'est pas une cause d'inquiétude.
  • notice : Quelque chose de normal, mais qui vaut la peine d'être remarqué ce qui s'est passé.
  • info : Un message informatif qui pourrait être agréable à savoir.
  • debug : Informations de débogage qui peuvent être utiles pour identifier où se produit un problème.

Les niveaux plus élevés dans la liste sont considérés comme une priorité plus élevée. Si vous spécifiez un niveau, le journal enregistre ce niveau et tous les niveaux supérieurs au niveau spécifié.

Par exemple, si vous spécifiez error, le journal enregistrera les messages étiquetés error, crit, alert et emerg.

Un exemple de l'utilisation de cette directive se trouve dans le fichier de configuration principal. Utilisez votre éditeur de texte préféré pour accéder au fichier de configuration suivant. Cet exemple utilise nano :

sudo nano /etc/nginx/nginx.conf

Faites défiler le fichier jusqu'à la section # Logging Settings et remarquez les directives suivantes :

. . .
##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
. . .

Si vous ne voulez pas que le error_log enregistre quoi que ce soit, vous devez envoyer la sortie dans /dev/null :

. . .
error_log /dev/null crit;
. . .

L'autre directive de journalisation, access_log, sera discutée dans la section suivante.

Comprendre les directives de journalisation de HttpLogModule

Alors que la directive error_log fait partie du module principal, la directive access_log fait partie du HttpLogModule. Cela permet de personnaliser les journaux.

Il y a quelques autres directives incluses avec ce module qui aident à configurer des journaux personnalisés.

Directive log_format

La directive log_format est utilisée pour décrire le format d'une entrée de journal en utilisant du texte brut et des variables.

Il existe un format prédéfini avec Nginx appelé combined. Il s'agit d'un format courant utilisé par de nombreux serveurs.

Ce qui suit est un exemple du format combiné s'il n'était pas défini en interne et devait être spécifié avec la directive log_format :

log_format combined '$remote_addr - $remote_user [$time_local]  '
		    '"$request" $status $body_bytes_sent '
		    '"$http_referer" "$http_user_agent"';

Cette définition s'étend sur plusieurs lignes jusqu'à ce qu'elle trouve le point-virgule (;).

Les lignes commençant par un signe dollar ($) indiquent des variables, tandis que les caractères comme -, [ et ] sont interprétés littéralement.

La syntaxe générale de la directive est :

log_format format_name string_describing_formatting;

Vous pouvez utiliser les variables prises en charge par le module principal pour formuler vos chaînes de journalisation.

Comprendre la directive access_log

La directive access_log utilise une syntaxe similaire à celle de la directive error_log, mais elle est plus flexible. Elle est utilisée pour configurer la journalisation personnalisée.

La directive access_log utilise la syntaxe suivante :

access_log /path/to/log/location [ format_of_log buffer_size ];

La valeur par défaut pour access_log est le format combined mentionné dans la section log_format. Vous pouvez utiliser n'importe quel format défini par une définition log_format.

La taille du tampon est la taille maximale de données que Nginx retiendra avant de tout écrire dans le journal. Vous pouvez également spécifier la compression du fichier journal en ajoutant gzip dans la définition :

access_log /path/to/log/location format_of_log gzip;

Contrairement à la directive error_log, si vous ne souhaitez pas de journalisation, vous pouvez la désactiver en la mettant à jour dans le fichier de configuration :

. . .
##
# Logging Settings
##

access_log off;
error_log /var/log/nginx/error.log;

. . .

Il n'est pas nécessaire d'écrire vers /dev/null dans ce cas.

Gestion d'une rotation des journaux

À mesure que les fichiers journaux augmentent, il devient nécessaire de gérer les mécanismes de journalisation pour éviter de remplir votre espace disque. La rotation des journaux est le processus consistant à remplacer les fichiers journaux et éventuellement à archiver les anciens fichiers pendant une période déterminée.

Nginx ne fournit pas d'outils pour gérer les fichiers journaux, mais il inclut des mécanismes pour aider à la rotation des journaux.

Rotation manuelle des journaux

Pour faire pivoter vos journaux manuellement, vous pouvez créer un script pour les faire pivoter. Par exemple, déplacez le journal actuel vers un nouveau fichier pour l'archivage. Un schéma courant consiste à nommer le fichier journal le plus récent avec un suffixe .0, puis à nommer les fichiers plus anciens avec .1, et ainsi de suite :

mv /path/to/access.log /path/to/access.log.0

La commande qui fait réellement pivoter les journaux est kill -USR1 /var/run/nginx.pid. Cela ne tue pas le processus Nginx, mais lui envoie plutôt un signal provoquant le rechargement de ses fichiers journaux. Cela fera en sorte que les nouvelles requêtes soient enregistrées dans le fichier journal actualisé :

kill -USR1 `cat /var/run/nginx.pid`

Le fichier /var/run/nginx.pid est l'endroit où Nginx stocke le PID du processus maître. Il est spécifié en haut du fichier de configuration /etc/nginx/nginx.conf avec la ligne qui commence par pid :

sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
...

Après la rotation, exécutez sleep 1 pour permettre au processus de terminer le transfert. Vous pouvez ensuite compresser les anciens fichiers ou effectuer tous les processus post-rotation que vous souhaitez :

sleep 1

[ post-rotation processing of old log file ]

Rotation des journaux avec logrotate

L'application logrotate est un programme utilisé pour faire pivoter les journaux. Il est installé par défaut sur Ubuntu, et Nginx sur Ubuntu est livré avec un script logrotate personnalisé.

Utilisez votre éditeur de texte préféré pour accéder au script de rotation. Cet exemple utilise nano :

sudo nano /etc/logrotate.d/nginx

La première ligne du fichier spécifie l'emplacement auquel les lignes suivantes s'appliqueront. Gardez cela à l'esprit si vous changez l'emplacement de la journalisation dans les fichiers de configuration Nginx.

Le reste du fichier précise que les journaux seront archivés quotidiennement et que 52 copies plus anciennes seront conservées.

Remarquez que la section postrotate contient une commande similaire aux mécanismes de rotation manuelle précédemment utilisés :

. . .
postrotate
	[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
. . .

Cette section indique à Nginx de recharger les fichiers journaux une fois la rotation terminée.

Conclusion

Une configuration et une gestion appropriées des journaux peuvent vous faire gagner du temps et de l'énergie en cas de problème avec votre serveur. Avoir accès aux informations qui vous aideront à diagnostiquer un problème peut faire la différence entre une réparation triviale et un casse-tête persistant.

Il est important de surveiller les journaux du serveur afin de maintenir un site fonctionnel et de s'assurer que vous n'exposez pas d'informations sensibles. Ce guide ne sert que d'introduction à votre expérience avec la journalisation. Vous pouvez en apprendre davantage sur des conseils généraux dans notre tutoriel sur Comment résoudre les erreurs courantes de Nginx.