5 votes

Signaux PHP-FPM pour la rotation du pool error_log

Je déplace toutes les tâches de rotation des journaux de mon serveur pour logrotate. Le serveur dispose de plusieurs pools PHP-FPM, chacun d'entre eux étant configuré avec un serveur séparé. error_log directive.

La recette de logrotate pour les journaux est assez simple :

/var/log/php/*.log
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        dateext
        sharedscripts
        postrotate
                # Need for signaling the php-fpm process?
        endscript
}

Dois-je envoyer un signal aux pools php-fpm pour qu'ils prennent en compte les nouveaux handles pour les fichiers error_log (dans le fichier postrotate script) ? Si oui, quel signal ?

7voto

cyberx86 Points 20450

En plus des signaux normaux, PHP-FPM reconnaît deux signaux "définis par l'utilisateur" : SIGUSR1 et SIGUSR2.

  • SIGUSR1 - fait tourner les fichiers journaux.
  • SIGUSR2 - rechargement gracieux de tous les workers + rechargement de la conf/binaire de fpm

Pour la rotation du fichier journal, SIGUSR1 serait bien adapté. En référence spécifique à votre scénario, un exemple de configuration de logrotate est détaillé sur cette page . Le signal est transmis comme suit :

kill -USR1 `cat /path/to/php-fpm.pid`

Les signaux de PHP-FPM sont définis à : http://php-fpm.org/wiki/Documentation

0 votes

Merci pour votre réponse ! Pouvez-vous confirmer que SIGUSR1 est également nécessaire pour faire tourner les journaux des pools ? Dans la page mentionnée, il n'est question que du journal principal de php-fpm qui est apparemment "toujours ouvert" par le processus. Cependant, appeler SIGUSR1 ne fait pas de mal... ;)

0 votes

Avec la plupart des configurations, logrotate déplacera l'ancien fichier et en créera un nouveau. Si un processus détient un handle de fichier vers le fichier original, il continuera à écrire dans ce fichier même s'il a été déplacé (c'est-à-dire qu'il n'utilisera pas le nouveau fichier). Il existe plusieurs solutions à ce problème : a) utiliser copytruncate - qui copiera le fichier et tronquera l'original, de sorte que le fichier dans lequel on écrit est le fichier tronqué b) envoyer au processus de journalisation un signal pour recharger ses fichiers journaux c) faire passer les journaux par un processus intermédiaire qui s'occupera de la rotation.

0 votes

Il y a quelques possibilités supplémentaires qui compliquent les choses - PHP-FPM peut renvoyer les erreurs au serveur web (qui s'occupera de la journalisation) ou il peut écrire les journaux directement. En fait, si le processus de journalisation conserve son identifiant de fichier sur le journal (ce qui est probable dans la plupart des cas), vous devez lui signaler qu'il doit recharger les journaux.

2voto

antonbormotov Points 123

Oui, vous devez envoyer ce signal, mais au lieu de le faire manuellement, il est préférable d'ajouter l'appel dans le suivi script :

...
postrotate
    /usr/lib/php5/php5-fpm-reopenlogs
endscript
...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X