每个星期天晚上,在 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:我知道这不能解释为什么会出现分段错误,但是使用这种方法,您在旋转过程中就不会再感到优雅了。