Por que o logrotate está causando falhas no Apache seg toda vez?

15

Toda vez que o logrotateApache / 2.4.7 (Ubuntu) é executado, há uma falha de seg e não é reiniciado:

[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

Meu script de logrotate do apache se parece com:

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

I manter os logs padrão no /var/log/apache2, mas eu manter registros específicos vhost (para os três vhosts diferentes hospedados neste servidor) no /srv/apache/logdiretório (por exemplo mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

As 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

onde export APACHE_LOG_DIR=/var/log/apache2$SUFFIX. Nos meus arquivos vhost conf, como /etc/apache2/sites-enabled/mysite1.confeu tenho:

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

e similar para os outros sites.

Alguém sabe por que o logrotate está causando esse travamento?

Mais uma coisa:

Forçando manualmente o logrotate como root:

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

não causa a falha seg, mas eu sei que é a rotação do log, já que tentei jogar com os horários (semanalmente, diariamente) e a falha seg sempre ocorre exatamente quando os logs estão sendo rotacionados apenas.

Como reproduzir sob 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

Se eu comentar, o /srv/apache/log/*.logbloco de rotação na /etc/logrotate.d/apachefalha seg também não ocorre.

fpghost
fonte
Forme a mensagem de erro que parece /usr/sbin/apachectl gracefulser o ofensor (em teoria, scripts em /etc/logrotate.d/httpd-prerotate também são candidatos). Você pode confirmar executando /usr/sbin/apachectl gracefulmanualmente? Há mais dicas quando isso acontece no log de erros global do Apache (ou no syslog global), talvez quando você aumenta o LogLevel não apenas dentro do <VirtualHost>, mas globalmente?
Nils Toedtmann
/usr/sbin/apachectl gracefulmanualmente na linha cmd não causa problemas (Observe também que essa linha era originalmente, /etc/init.d/apache2 reload > /dev/nullmas depois de receber a falha seg, mudei para um apachectlconselho que li on-line, obviamente não consertou as coisas). O LogLevel já está no nível mais alto possível globalmente, trace8definido no apache.confarquivo
precisa saber é
E apenas para descartar: /etc/logrotate.d/httpd-prerotatenão existe.
fpghost
Isso geralmente é causado por um módulo não sendo desligado corretamente. Você está usando algum módulo exótico? Algo adicionado recentemente? Módulos de terceiros? Tente desativá-los.
Giovanni Tirloni
Então, /usr/sbin/apachectl gracefulestá causando um segfault quando emitido pelo logrotate, mas não quando emitido manualmente? Odd
Nils Toedtmann

Respostas:

13

Parece que se eu apenas alterar o script logrotate para ser um único bloco, ou seja /var/log/apache2/*.log, /srv/apache/logs/*.log {....}, não recebo o segfault. Então, apenas os dois blocos estavam causando uma segunda tentativa de reinicialização durante a primeira reinicialização ...

Se eu entrar apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &na linha cmd, o meu sistema falha, o que parece confirmar

fpghost
fonte
1
Eu tenho esse problema exato, mas apenas um bloco no meu script de logrotate para começar. Alguma ideia?
Kdextify