Почему logrotate каждый раз вызывает сбой Apache?


15

Каждый раз, когда logrotateзапускается Apache / 2.4.7 (Ubuntu), возникает ошибка seg и он не перезапускается:

[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

Мой скрипт apache logrotate выглядит так:

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

Я держу журналы по умолчанию в /var/log/apache2, но я держу виртуальных хостах журналы конкретные (для трех различных размещенных на виртуальный хост одновременно этом сервере) в /srv/apache/logкаталоге (например mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

Соответствующие части /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. В моих файлах conf vhost, таких как у /etc/apache2/sites-enabled/mysite1.confменя есть:

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

и аналогично для других сайтов.

Кто-нибудь знает, почему logrotate вызывает этот сбой?

Еще кое-что:

Вручную заставляя logrotate от имени пользователя root:

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

не вызывает ошибку сегмента, но я знаю, что это logrotate, поскольку я пытался поиграть со временем (еженедельно, ежедневно), и ошибка сегмента всегда возникает именно тогда, когда журналы вращаются только.

Как воспроизвести по требованию

# 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

в заключение

Если я закомментирую /srv/apache/log/*.logповорот блока в /etc/logrotate.d/apacheseg, то сбоя тоже не произойдет.


Сформируйте сообщение об ошибке, которое выглядит как /usr/sbin/apachectl gracefulнарушитель (теоретически сценарии в /etc/logrotate.d/httpd-prerotate также являются кандидатами). Можете ли вы подтвердить, запустив /usr/sbin/apachectl gracefulвручную? Есть ли еще подсказки, когда это происходит в глобальном журнале ошибок Apache (или глобальном системном журнале), возможно, когда вы увеличиваете LogLevel не только внутри <VirtualHost>, но и глобально?
Нильс Тёдтманн

/usr/sbin/apachectl graceful вручную в строке cmd не вызывает проблем (Также обратите внимание, что эта строка изначально /etc/init.d/apache2 reload > /dev/null но после получения ошибки сегмента я переключился apachectlна совет, который я читал в Интернете, очевидно, это не исправило ). LogLevel уже на самом высоком глобальном уровне, trace8указанном в apache.confфайле.
fpghost

И просто чтобы исключить это: /etc/logrotate.d/httpd-prerotateне существует.
fpghost

Обычно это вызвано тем, что модуль не выключается должным образом. Вы используете какие-нибудь экзотические модули? Что-нибудь добавлено недавно? Сторонние модули? Попробуйте отключить их.
Джованни Тирлони

Так /usr/sbin/apachectl graceful вызывает ли segfault, когда выдается logrotate, а не когда выдается вручную? Одд
Nils Toedtmann

Ответы:


13

Кажется, что если я просто изменю сценарий logrotate на отдельный блок, то есть /var/log/apache2/*.log, /srv/apache/logs/*.log {....}я не получу segfault. Так что только два блока вызывали вторую попытку перезапуска во время первого перезапуска ...

Если я ввожу apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &в строке cmd моя система делает segfault, который, кажется, подтверждает


1
У меня есть именно эта проблема, но только один блок в моем скрипте logrotate для начала. Есть идеи?
kontextify
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.