为什么logrotate每次都会导致Apache段错误?


15

每次logrotate运行Apache / 2.4.7(Ubuntu)时都会遇到段错误,并且不会重新启动:

[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.logmysite1_access.logmysite2_error.logmysite2_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导致此崩溃吗?

还有一件事:

手动强制将logrotate作为根用户:

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

不会导致seg错误,但我知道它是logrotate,因为我尝试过与时间(每周,每天)一起玩,并且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

最后

如果我注释掉seg中的/srv/apache/log/*.log旋转块,/etc/logrotate.d/apache也不会发生故障。


错误消息看起来像是/usr/sbin/apachectl graceful罪犯(理论上/etc/logrotate.d/httpd-prerotate中的脚本也是候选者)。您可以通过/usr/sbin/apachectl graceful手动运行确认吗?当Apache的全局错误日志(或全局syslog)中发生这种情况时,是否还有其他提示?也许不仅在<VirtualHost>中而是在全局范围内增加LogLevel时?
Nils Toedtmann 2014年

/usr/sbin/apachectl graceful手动在cmd行上不会造成任何问题(还请注意,该行最初是/etc/init.d/apache2 reload > /dev/null但在遇到seg错误后,我改成apachectl在线阅读的建议,显然它不能解决问题)。LogLevel已在文件中trace8设置为全局最高级别apache.conf
fpghost 2014年

只是要排除它:/etc/logrotate.d/httpd-prerotate不存在。
fpghost 2014年

这通常是由于模块无法正确关闭引起的。您在使用任何外来模块吗?最近添加了什么?第三方模块?尝试禁用它们。
Giovanni Tirloni 2014年

那么/usr/sbin/apachectl graceful在由logrotate发出而不是在手动发出时引起段错误吗?奇数
尼尔斯·托德曼2014年

Answers:


13

看来,如果我只是将logrotate脚本更改为单个块,即/var/log/apache2/*.log, /srv/apache/logs/*.log {....}我没有得到segfault。因此,这只是两个块在第一次重新启动期间引起了第二次重新启动尝试...

如果我apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &在cmd行上输入我的系统执行段错误,这似乎可以确认


1
我有这个确切的问题,但是从我的logrotate脚本开始只有一个块。有任何想法吗?
kontextify
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.