¿Por qué el logrotate hace que Apache falle cada vez?

15

Cada vez que se logrotateejecuta Apache / 2.4.7 (Ubuntu) experimenta una falla seg y no se reinicia:

[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

Mi script de apache logrotate se ve así:

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

Guardo los registros predeterminados en /var/log/apache2, pero no dejo de registros específicos vhost (para los tres diferentes dominios virtuales alojadas en este servidor) en el /srv/apache/logdirectorio (por ejemplo mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

Las partes relevantes 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

donde export APACHE_LOG_DIR=/var/log/apache2$SUFFIX. En mis archivos conf de vhost, como /etc/apache2/sites-enabled/mysite1.conftengo:

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

y similar para los otros sitios.

Alguien sabe por qué logrotate está causando este bloqueo?

Una cosa más:

Forzar manualmente el logrotate como root:

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

no causa la falla seg, pero sé que es logrotate ya que he intentado jugar con los tiempos (semanal, diario) y la falla seg siempre ocurre exactamente ya que los registros se están rotando solo.

Cómo reproducir bajo demanda

# 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

Finalmente

Si comento el /srv/apache/log/*.logbloque de rotación en /etc/logrotate.d/apachela falla seg tampoco ocurre.

fpghost
fuente
Forma el mensaje de error que parece ser /usr/sbin/apachectl gracefulel delincuente (en teoría, los scripts dentro de /etc/logrotate.d/httpd-prerotate también son candidatos). ¿Puedes confirmar corriendo /usr/sbin/apachectl gracefulmanualmente? ¿Hay más pistas cuando esto sucede en el registro de errores global de Apache (o el registro del sistema global), tal vez cuando aumenta el LogLevel no solo dentro de <VirtualHost> sino globalmente?
Nils Toedtmann
/usr/sbin/apachectl gracefulmanualmente en la línea cmd no causa problemas (también tenga en cuenta que esta línea era originalmente /etc/init.d/apache2 reload > /dev/nullpero después de obtener la falla seg, cambié a apachectlun consejo que leí en línea, obviamente no solucionó las cosas). LogLevel ya está en el nivel más alto posible a nivel mundial, trace8establecido en el apache.confarchivo.
fpghost
Y solo para descartarlo: /etc/logrotate.d/httpd-prerotateno existe.
fpghost
Esto generalmente es causado por un módulo que no se apaga correctamente. ¿Estás utilizando algún módulo exótico? ¿Algo agregado recientemente? Módulos de terceros? Intenta deshabilitarlos.
Giovanni Tirloni
Entonces, ¿ /usr/sbin/apachectl gracefulestá causando un segfault cuando lo emite logrotate, pero no cuando se emite manualmente? Impar
Nils Toedtmann

Respuestas:

13

Parece que si solo cambio el script logrotate para que sea un solo bloque, es decir /var/log/apache2/*.log, /srv/apache/logs/*.log {....}, no obtengo el segfault. Entonces, solo los dos bloques estaban causando un segundo intento de reinicio durante el primer reinicio ...

Si ingreso apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &en la línea de cmd, mi sistema TIENE segfault, lo que parece confirmar

fpghost
fuente
1
Tengo este problema exacto, pero solo un bloque en mi script de logrotate para comenzar. ¿Algunas ideas?
kontextify