Debian Squeeze 上日志轮换后出现 Apache 分段错误

Debian Squeeze 上日志轮换后出现 Apache 分段错误

每个星期天晚上,在 debian squeeze 的日志轮换期间,当 postlogrotation 尝试重新加载配置和/或重新启动 apache 时,apache 都会崩溃。我甚至尝试通过硬重启(停止启动)服务来重新配置日志轮换,但仍然出现同样的故障。

发生的情况是,apache 实际上似乎启动正常,但每个请求都会在 apaches error.log 中引发以下错误:

[notice] child pid xxxx exit signal Segmentation fault (11)

如果我再次手动重启 Apache,它又可以正常工作了。有人知道为什么会发生这种情况吗?

AWS 实例正在运行 debian squeeze、apache 2.2.16、php 5.4.32 和 varnish 3(如果重要的话)。

欢迎提出任何建议。如果我遗漏了相关信息,请告诉我!

更新:我将 Magento 网站移至另一台服务器,问题不再发生(尽管仍有一些其他网站),新服务器上也没有发生这种情况。至于是什么原因造成的,我还是不太清楚。

答案1

此类失败可能有不同的原因,而不是假设某些事情,我建议您花一点时间调试 logrotate 脚本并制作 apache 的核心转储来分析问题gdb

您可以像这样(-v verbose,-f force)以详细模式手动运行 logrotate 脚本:

logrotate -vf /etc/logrotate.d/apache2 

为了制作 cordump 并用 gdb 进行分析,您可以使用 apt-get 安装所有必要的软件包,而且配置起来并不困难。

安装 gdb 和必要的符号文件::

apt-get install gdb 
apt-get install apache2-dbg php5-dbg

CoreDumpDirectory在apache配置中设置:

CoreDumpDirectory /tmp/apache2-coredump

将 ulimit 设置为 unlimited:

ulimit -c unlimited

你可以像这样使用 gdb 读取核心转储:

gdb apache2 -core /tmp/apache2-coredump/core

以下是详细操作方法:如何找出导致 Apache 分段错误的原因

答案2

在你的 apache 配置中使用 rotatelogs 来更改轮换方法:

 CustomLog "|bin/rotatelogs -l /var/logs/logfile.%Y.%m.%d 86400" common 

rotatelogs 将进行日志轮换,因此不再需要 graceful。

您的 cron 只需要压缩旧日志。

文档:https://httpd.apache.org/docs/2.2/programs/rotatelogs.html

PS:我知道这不能解释为什么会出现分段错误,但是使用这种方法,您在旋转过程中就不会再感到优雅了。

相关内容