web-dev-qa-db-fra.com

Journaux Nrotx Logrotate

Je suis sous Ubuntu 15.04 et l’installation standard de nginx (apt-get install nginx) est active.

Tout fonctionne bien, mais je remarque que les journaux nginx sont en rotation, mais nginx continue de générer le même fichier journal, par exemple. /var/log/nginx/error.log est vide, mais /var/log/nginx/error.log.1 est en train de recevoir des éléments.

Bien sûr, si je redémarre nginx, le fichier journal normal commence à être écrit. Existe-t-il un bogue quelque part dans le script logrotate? Est-il nécessaire de redémarrer nginx lors d'une rotation?

6
willwade

Vous utilisez Ubuntu version 15.

Oui, vous pouvez vous débrouiller avec logrotate et avec des extraits de script comme dans les autres réponses. Mais vous utilisez Ubuntu version 15 . Sur votre système d'exploitation, les services sont exécutés sous systemd, qui par défaut capture leurs sorties d'erreur standard et syslog et gère la journalisation. Nginx n'a pas besoin d'écrire dans ce fichier error.log en premier lieu. Il n'y a aucun besoin de logrotate.

D'autres réponses et les commentaires en-dessous peuvent vous amener à regarder /etc/init.d/nginx peut-être. Ne pas Ce fichier n'est pas pertinent. Vous utilisez Ubuntu version 15 . Le fichier approprié, tel qu'il est fourni dans le paquet Ubuntu nginx-common, est /lib/systemd/system/nginx.service, c'est ce que systemd utilisera, ignorant complètement l'ancien fichier /etc/init.d/nginx qui est entièrement remplacé par un fichier approprié. Fichier d'unité de service Systemd.

D'autres réponses pourraient vous amener à regarder également /etc/logrotate.d/nginx. Vous êtes peut-être mystifié par la contradiction entre ce que vous pouvez voir clairement ici , en essayant d'exécuter l'ancien script System 5 rc avec une sous-commande non standard invoke-rc.d, et la demande qu'il n'y a pas de strophe postrotate. Mais encore une fois, tout simplement pas. Ne vous concentrez pas sur ces strophes de contrôle logrotate en premier lieu. Vous utilisez Ubuntu version 15 avec un paquet contenant déjà une unité système et n'utilisant pas de scripts System 5 rc sur votre système d'exploitation. et un gestionnaire de service qui enregistre la sortie du service.

Deux étapes pour faire les choses à la manière systemd:

Configurez nginx de manière plus appropriée.

Votre service nginx doit être invité à écrire simplement son journal avec son erreur standard. En prime, vous pouvez envoyer votre journal des accès au journal via syslog, que systemd intercepte également.

Ceci est fait avec directives de configuration globales nginx et directives de module http. Plus précisément:

  • error_log stderr ;
  • access_log syslog:server=unix:/dev/log ;

Vous pouvez soit changer votre fichier nginx.conf pour les indiquer comme cette personne a fait, soit faire ce que Alexander Kuznecov a fait ici et modifier votre fichier nginx.service en directives pass (globales) sur la ligne de commande nginx:

Type = forking 
 PIDFile =/run/nginx.pid 
 ExecStart =/usr/bin/nginx -g 'daemon on; error_log stderr; master_process on; '

Oubliez complètement logrotate.

systemd met la sortie standard et l'erreur standard de tous les services dans son journal. Il gère la rotation des fichiers journaux lui-même. Il n'y a aucun signal et aucun rechargement de service nginx impliqué. Vous pouvez lire les dernières entrées du journal liées au service avec (exécuter en tant que superutilisateur ou en tant qu'utilisateur adm)

systemctl status nginx.service
journalctl -u nginx.service -b
5
JdeBP

La raison pour laquelle nginx écrit dans le fichier pivoté est une section manquante postrotate dans le fichier logrotate de nginx pour recharger la configuration de nginx.

logrotate a renommé le fichier, mais le changement de nom ne ferme ni ne modifie le descripteur de fichier (le noyau gère en interne une table de descripteur montrant tous les fichiers ouverts par descripteurs ou descripteurs de fichiers), le descripteur de fichier restant identique à celui utilisé précédemment. . Ainsi, le processus nginx continuera de se décharger sur le même descripteur de fichier (celui qui a fait l'objet de la rotation) plutôt que sur le fichier nouvellement créé.

Pour résoudre ce problème, ajoutez une section postrotate dans le fichier de configuration logrotate afin de recharger le fichier de configuration de nginx.

Par exemple, voici la section postrotate de /etc/logrotate.d/Apache2:

    postrotate
            if /etc/init.d/Apache2 status > /dev/null ; then \
                /etc/init.d/Apache2 reload > /dev/null; \
            fi;
    endscript
1
heemayl