我负责的服务器已经承受了一段时间的压力,超出了临界点。我建议进行一些改变,目前团队其他成员正在实施这些改变,这些改变应该可以缓解网站的核心基础设施问题。但是,有一个严重的问题需要采取权宜之计来为我们争取一些时间。
由于日志轮换 CRON 正在运行,Apache 每天早上 7:30 都会重新启动。6:00 - 9:00 是我们网站正常使用高峰时段,当与 CRON 结合时,服务器内存就会耗尽。
哪种日志轮换配置会有帮助?我应该将其从每日改为每小时吗?更改阈值?只需更改时间(我这样做了,但仍然遇到了中断)。
答案1
EEAA 建议使用远程日志服务器来完全解决问题,但在您的环境中可能无法实现。
使用 LogRotate重新加载Apache 而不是重新启动它,如本网站。您可能希望将参数更改为每日。无论您每小时、每天还是每周轮换,停机时间都不会有任何差异。
/var/log/apache2/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}
重新加载应让 Apache 在重新加载配置之前完成所有未完成请求的服务。您可能会丢失一些请求,但我认为不会丢失很多。您可能不会丢失任何请求。
如果您需要更高的可靠性,您应该考虑使用两台负载平衡服务器进行某种健康检查或实时故障转移,或者使用远程日志服务器。
答案2
无需重启或重新加载 Apache 即可轮换日志。缺点是您可能会丢失一些日志条目。
有两种方法可以实现此目的:
- 设置一个单独的日志服务器,并使用您喜欢的任何系统日志软件将 Apache 日志转发到该服务器。这样,日志轮换将在另一台服务器上处理,不会影响 Apache。缺点是您会增加网络流量,额外的 CPU 周期和内存使用量可能会使服务器超出极限,因为它已经接近极限。此外,在流量大的情况下,一些日志行可能会在传输过程中丢失。
- 您无需重新加载 apache 即可开始写入新文件,只需复制文件内容然后清空旧文件即可。这样做的好处是您不必重新启动 apache。缺点是您可能会丢失在复制结束和文件归零之间的几微秒内写入的一些日志条目。对于此选项,
postrotate
配置文件的部分应更改为copytruncate
。
答案3
更改 cron 计划时间,甚至从 logrotated 中删除 apache 并根据需要手动设置。停止 apache 服务,暂停几秒钟让 apache 真正完成关闭,重命名日志文件,重新启动 apache。由于您只重命名了日志文件,因此它会保留在同一目录中并“立即”发生。一旦您的服务恢复,然后将日志文件移动/压缩/无论什么都移动到需要的位置。
如果它得到真的糟糕,我内心的 BOFH 说将日志指向 /dev/null 并且不用担心旋转它们......