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?
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:
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; '
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
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