Чому логротат приводить 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. У моїх файлах vhost conf, таких як у /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 -v -f /etc/logrotate.d/apache2

не спричиняє помилки seg, але я знаю, що це логроте, як я намагався грати із часом (щотижня, щодня), і несправність сегмента завжди відбувається саме так, як журнали обертаються тільки.

Як відтворити на вимогу

# 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/apacheсегменті вини також не виникає.


/usr/sbin/apachectl gracefulФормуйте повідомлення про помилку, яке воно виглядає як правопорушник (теоретично сценарії в /etc/logrotate.d/httpd-prerotate також є кандидатами). Ви можете підтвердити, запустивши /usr/sbin/apachectl gracefulвручну? Чи є ще якісь підказки, коли це відбувається в глобальному журналі помилок Apache (або глобальному syslog), можливо, коли ви збільшуєте LogLevel не тільки в межах <VirtualHost>, але й у всьому світі?
Нілс Тодтманн

/usr/sbin/apachectl gracefulвручну в cmd-рядці не виникає проблем (Також зауважте, що ця лінія була спочатку, /etc/init.d/apache2 reload > /dev/nullале після отримання помилки Seg, я перейшов 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.