Warum verursacht Logrotate, dass Apache jedes Mal einen Seg-Fehler macht?

15

Bei jedem logrotateStart von Apache / 2.4.7 (Ubuntu) tritt ein Seg-Fehler auf und es wird kein Neustart durchgeführt:

[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

Mein Apache-Logrotate-Skript sieht folgendermaßen aus:

/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
}

Ich halte die Standardprotokolle in /var/log/apache2, aber ich halte vHost spezifische Protokolle (für die drei verschiedenen vhosts auf diesem Server gehostet) im /srv/apache/logVerzeichnis (zB mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

Die relevanten Teile von /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

wo export APACHE_LOG_DIR=/var/log/apache2$SUFFIX. In meinen vhost conf-Dateien habe /etc/apache2/sites-enabled/mysite1.confich:

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

und ähnliches für die anderen Websites.

Weiß jemand, warum Logrotate diesen Absturz verursacht?

Eine Sache noch:

Manuelles Erzwingen der Logrotate als root:

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

verursacht den Seg-Fehler nicht, aber ich weiß, dass es logrotat ist, da ich versucht habe, mit den Zeiten zu spielen (wöchentlich, täglich) und der Seg-Fehler immer genau dann auftritt, wenn die Protokolle nur gedreht werden.

So reproduzieren Sie nach Bedarf

# 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

Schließlich

Wenn ich den /srv/apache/log/*.logRotationsblock /etc/logrotate.d/apacheauskommentiere, tritt der Seg-Fehler ebenfalls nicht auf.

fpghost
quelle
Aus der Fehlermeldung geht hervor, dass es sich /usr/sbin/apachectl gracefulum den Täter handelt (theoretisch sind Skripte in /etc/logrotate.d/httpd-prerotate auch Kandidaten). Können Sie dies durch /usr/sbin/apachectl gracefulmanuelles Ausführen bestätigen ? Gibt es weitere Hinweise, wenn dies im globalen Apache-Fehlerprotokoll (oder im globalen Syslog) geschieht, möglicherweise, wenn Sie den LogLevel nicht nur innerhalb von <VirtualHost>, sondern global erhöhen?
Nils Toedtmann
/usr/sbin/apachectl gracefulDie manuelle Eingabe in der Zeile cmd verursacht keine Probleme (Beachten Sie auch, dass diese Zeile ursprünglich vorhanden war, /etc/init.d/apache2 reload > /dev/nullaber nachdem ich den Seg-Fehler erhalten hatte, habe ich apachectlauf einen Rat, den ich online gelesen habe, gewechselt , offensichtlich wurden die Probleme nicht behoben). Der LogLevel ist bereits trace8in der apache.confDatei global auf den höchstmöglichen Wert eingestellt .
fpghost
Und nur um es auszuschließen: /etc/logrotate.d/httpd-prerotateexistiert nicht.
fpghost
Dies wird normalerweise dadurch verursacht, dass ein Modul nicht ordnungsgemäß heruntergefahren wird. Verwenden Sie exotische Module? Wurde kürzlich etwas hinzugefügt? Module von Drittanbietern? Versuchen Sie, sie zu deaktivieren.
Giovanni Tirloni
So /usr/sbin/apachectl gracefulverursacht eine segfault , wenn sie von logrotate ausgegeben, aber nicht , wenn sie manuell ausgegeben? Odd
Nils Toedtmann

Antworten:

13

Es sieht so aus, als ob ich, wenn ich nur das Logrotate-Skript in einen einzelnen Block ändere, den Segfault /var/log/apache2/*.log, /srv/apache/logs/*.log {....}nicht bekomme. Es waren also nur die beiden Blöcke, die beim ersten Neustart einen zweiten Neustartversuch verursachten ...

Wenn ich in apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &die cmd-Zeile eingebe, ist mein System SEGFault, was zu bestätigen scheint

fpghost
quelle
1
Ich habe genau dieses Problem, aber zunächst nur einen Block in meinem Logrotate-Skript. Irgendwelche Ideen?
kontextify