Dlaczego Logrotate powoduje za każdym razem błąd Apache?

15

Przy każdym logrotateuruchomieniu Apache / 2.4.7 (Ubuntu) napotyka błąd seg i nie uruchamia się ponownie:

[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

Mój skrypt logrotate Apache wygląda następująco:

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

Trzymam dzienniki domyślne /var/log/apache2, ale zachować vhosta szczegółowych logów (dla trzech różnych vhostów hostowane na tym serwerze) w /srv/apache/logkatalogu (na przykład mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

Odpowiednie części /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

gdzie export APACHE_LOG_DIR=/var/log/apache2$SUFFIX. W moich plikach vhost conf, takich jak /etc/apache2/sites-enabled/mysite1.confmam:

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

i podobne w przypadku innych witryn.

Czy ktoś wie, dlaczego przyczyną awarii jest Logrotate?

Jeszcze jedna rzecz:

Ręczne wymuszanie logrotate jako root:

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

nie powoduje błędu seg, ale wiem, że to logrotate, ponieważ próbowałem grać z czasem (co tydzień, codziennie), a błąd seg zawsze występuje dokładnie tak, jak tylko dzienniki są obracane.

Jak powielać na żądanie

# 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

Wreszcie

Jeśli skomentuję, /srv/apache/log/*.logblok obrotu w /etc/logrotate.d/apacheseg seg również nie występuje.

fpghost
źródło
Z komunikatu o błędzie wygląda /usr/sbin/apachectl gracefulto na przestępcę (teoretycznie skrypty w /etc/logrotate.d/httpd-prerotate są również kandydatami). Czy możesz to potwierdzić, uruchamiając /usr/sbin/apachectl gracefulręcznie? Czy są jeszcze jakieś wskazówki, kiedy dzieje się to w globalnym dzienniku błędów Apache (lub globalnym dzienniku systemowym), może kiedy zwiększasz LogLevel nie tylko w <VirtualHost>, ale globalnie?
Nils Toedtmann,
/usr/sbin/apachectl gracefulręcznie na linii cmd nie powoduje żadnych problemów (zauważ również, że ta linia była pierwotnie, /etc/init.d/apache2 reload > /dev/nullale po otrzymaniu błędu seg, zmieniłem się apachectlna poradę, którą czytałem online, oczywiście to nie naprawiło). LogLevel jest już najwyższy na świecie, trace8ustawiony w apache.confpliku.
fpghost
I żeby to wykluczyć: /etc/logrotate.d/httpd-prerotatenie istnieje.
fpghost
Jest to zwykle spowodowane nieprawidłowym zamknięciem modułu. Używasz jakichś egzotycznych modułów? Czy coś ostatnio zostało dodane? Moduły innych firm? Spróbuj je wyłączyć.
Giovanni Tirloni,
Więc /usr/sbin/apachectl gracefulpowoduje segfault, gdy jest wydawany przez logrotate, ale nie, gdy jest wydawany ręcznie? Nieparzysty
Nils Toedtmann

Odpowiedzi:

13

Wygląda na to, że jeśli zmienię skrypt logrotate na pojedynczy blok, tzn. /var/log/apache2/*.log, /srv/apache/logs/*.log {....}Nie dostanę błędu segfault. Tak więc tylko dwa bloki powodowały drugą próbę ponownego uruchomienia podczas pierwszego uruchomienia ...

Jeśli apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &wejdę w linię cmd, mój system BĘDZIE segfault, co wydaje się potwierdzać

fpghost
źródło
1
Mam dokładnie ten problem, ale na początek tylko jeden blok w moim skrypcie logrotate. Jakieś pomysły?
kontekstify