Pourquoi logrotate provoque-t-il à chaque fois la faille d'Apache?


15

A chaque logrotateexécution, Apache / 2.4.7 (Ubuntu) rencontre une erreur de segmentation et ne redémarre pas:

[Wed Sep 10 06:35:54.266018 2014] [mpm_event:notice] [pid 20599:tid 140630283466624] AH00493: SIGUSR1 received.  Doing graceful restart
[Wed Sep 10 06:35:54.885118 2014] [core:notice] [pid 20599] AH00060: seg fault or similar nasty error detected in the parent process

Mon script apache logrotate ressemble à:

/var/log/apache2/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
        /usr/sbin/apachectl graceful
    endscript
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi; \
    endscript
}

/srv/apache/log/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
        /usr/sbin/apachectl graceful
    endscript
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi; \
    endscript
}

Je garde les journaux par défaut dans /var/log/apache2, mais je continue à journaux spécifiques vhost (pour les trois vhosts différents hébergés sur ce serveur) dans le /srv/apache/logrépertoire (par exemple mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

Les parties pertinentes de /etc/apache2/apache.conf:

#/etc/apache2/apache.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel trace8   # I set to try and get more info about this problem.
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

export APACHE_LOG_DIR=/var/log/apache2$SUFFIX. Dans mes fichiers vhost conf, tels que /etc/apache2/sites-enabled/mysite1.confj'ai:

#/etc/apache2/sites-enabled/mysite1.conf
LogLevel debug
ErrorLog  /srv/apache/log/mysite1_error.log
CustomLog /srv/apache/log/mysite2_access.log combined

et similaire pour les autres sites.

Quelqu'un sait pourquoi logrotate est à l'origine de ce crash?

Une dernière chose:

Forcer manuellement le logrotate en tant que root:

logrotate -v -f /etc/logrotate.d/apache2

ne cause pas le défaut de segmentation, mais je sais que c'est logrotate car j'ai essayé de jouer avec les temps (hebdomadaire, quotidien) et le défaut de segmentation se produit toujours exactement comme les journaux sont tournés uniquement.

Comment reproduire sur demande

# Set a crontab to run each minute (simulating cron.daily run of logrotate)
crontab -e
*/1 * * * * root /usr/sbin/logrotate -v -f /etc/logrotate.d/apache2 > /home/myuser/logrotate.log 2>&1

finalement

Si je commente le /srv/apache/log/*.logbloc de rotation dans /etc/logrotate.d/apachele défaut seg ne se produit pas non plus.


Le message d'erreur auquel il ressemble /usr/sbin/apachectl gracefulest celui du délinquant (en théorie, les scripts dans /etc/logrotate.d/httpd-prerotate sont également des candidats). Pouvez-vous confirmer en exécutant /usr/sbin/apachectl gracefulmanuellement? Y a-t-il d'autres astuces lorsque cela se produit dans le journal d'erreurs global d'Apache (ou le syslog global), peut-être lorsque vous augmentez le LogLevel non seulement dans <VirtualHost> mais globalement?
Nils Toedtmann

/usr/sbin/apachectl gracefulmanuellement à la ligne cmd ne pose aucun problème (Notez également que cette ligne était à l'origine /etc/init.d/apache2 reload > /dev/nullmais après avoir obtenu la faute de segmentation, je suis passé à un apachectlconseil que j'ai lu en ligne, évidemment cela n'a pas résolu les choses). Le LogLevel est déjà au niveau le plus élevé possible au niveau mondial, trace8défini dans le apache.conffichier.
fpghost

Et juste pour l'exclure: /etc/logrotate.d/httpd-prerotaten'existe pas.
fpghost

Cela est généralement dû à un module qui ne s'arrête pas correctement. Utilisez-vous des modules exotiques? Quelque chose a été ajouté récemment? Modules tiers? Essayez de les désactiver.
Giovanni Tirloni

Alors , /usr/sbin/apachectl gracefulest à l' origine une erreur de segmentation lors de son émission par logrotate, mais pas quand émis manuellement? Odd
Nils Toedtmann

Réponses:


13

Il semble que si je change simplement le script logrotate en un seul bloc, c'est-à-dire que /var/log/apache2/*.log, /srv/apache/logs/*.log {....}je n'obtiens pas le défaut de segmentation. Donc, c'était juste que les deux blocs provoquaient une deuxième tentative de redémarrage lors du premier redémarrage ...

Si j'entre apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &sur la ligne cmd, mon système FAIT une erreur de segmentation, ce qui semble confirmer


1
J'ai ce problème exact, mais un seul bloc dans mon script logrotate pour commencer. Des idées?
kontextify
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.