有人可以告诉我,这是否是合理的apache关心?

我被告知,我们(脚本)每天重新启动apache已经build立,因为我们的日志轮换。 值得关注的是,如果logrotate在apache运行并接受请求的时候旋转,logrotate可能会在访问日志中丢失一行。

有人可以告诉我这是否合理,真实或完全废话?

在日志文件被转动之后,您需要重新启动服务器,因为Apache保持打开日志的文件句柄,并且如果不这样,将继续写入旧的日志文件。 将USR1发送给父母(正常重启)应该是有用的。

参考: 1.3,2.2

从2.2文档引用:

在即使是繁忙的服务器上,存储在日志文件中的信息量也非常大。 访问日志文件通常每10,000个请求增长1 MB或更多。 因此有必要通过移动或删除现有日志来定期轮换日志文件。 在服务器运行时,这是不能完成的,因为只要保持打开的文件,Apache就会继续写入旧的日志文件。 相反,在日志文件被移动或删除之后,必须重新启动服务器,以便它将打开新的日志文件。

通过使用平稳的重新启动,可以指示服务器打开新的日志文件,而不会丢失客户端的任何现有或挂起的连接。 但是,为了实现这一点,服务器在完成旧服务请求时必须继续写入旧的日志文件。 因此,在对日志文件进行任何处理之前,需要等待一段时间后重新启动。 简单地旋转日志并压缩旧日志以节省空间的典型场景是:

mv access_log access_log.old mv error_log error_log.old apachectl graceful sleep 600 gzip access_log.old error_log.old 

执行日志循环的另一种方法是使用pipe道日志,如下一节所述。

完全合理。 取决于你如何阻止Apache。

如果你正在做一个每晚HUP让服务器启动新的日志,那么你应该没有问题。 任何笨拙的停止和重新启动,你自己的,但你自己!

但是,夜间HUP中的任何连接都将丢失,这些下注者将不得不重新连接。 如果他们正处于一个大的下载的中间位可惜!

如果您将logging的字节logging为请求的一部分,则在下载完成之前不会logging连接,因此,由于HUP而丢失的连接将从日志中丢失。

你看过新的2.2.12版吗?

其中一个变化是使“通过rotatelogs传递”更加健壮,这样您就可以将rotate转发到rotatelogs实用程序,并且无需执行每晚的HUP就可以让它顶部和尾部的日志。 所以,如果你的日志字节服务,没有丢失的连接和没有丢失的日志事务

医生的话说

旋转发生在这个间隔的开始。 例如,如果轮换时间是3600,则日志文件将在每小时的开始处旋转; 如果轮换时间是86400,则日志文件将在午夜每晚旋转。

如果你看看rotatelogs的内容,那么他​​们是如何做这件事的并不明显,因为在find这一行之前,根本就没有魔法数字:

 tLogStart = (now / tRotation) * tRotation; 

这将使开始时间与当前小时(对于tRotation == 3600)或上一个午夜(对于tRotation == 86400)的开始alignment。 谁知道它会为其他数字做什么,例如16432?

编辑:我忘了说,我们已经看到优雅的问题不performance得很优雅。 具体来说,只是留下儿童进程。 这似乎已经被确认,因为v2.2.12现在有一个新的configuration指令GracefulShutdownTimeout,它指定了一个超时后,httpd进程终止,而不pipe任何请求被服务。

HTH

“Avahappy,

为什么要放弃这样一个大问题? 如果那么重要的话,可能需要把日志打印到绿条上作为备份。

是的,根据其他答案,问题是,Apache将继续写入它已经打开的文件句柄。

我们(和许多其他人)使用cronlog来避免这种情况。 在这个设置中,apache将日志传送给cronolog,并且服务器不需要重新启动/重新加载。