由于某种原因,我需要为许多 Apache 虚拟主机中的两个定义相同的访问日志文件。Apache Web Server 在技术上是否支持此操作?使用相同的日志文件是否会引起冲突?
<VirtualHost A>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>
<VirtualHost B>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>
答案1
简短回答
实际上是的。
细微澄清
虚拟主机之间不能发生可能的竞争条件。它们可能发生在 apache 子进程(线程)之间。
如果多个 apache 虚拟主机使用相同的 apache 子进程/线程登录到同一个文件,则并不意味着真正的麻烦源,因为单个进程/线程一次只能处理一个请求。
如果多个请求(因此多个子进程/线程同时登录到同一个文件)则可能会发生竞争问题。但是,如果同一个虚拟主机(因此,同一个日志文件)同时处理多个请求,则可能会发生这种情况,因此它也可能同时附加日志文件。即使单个虚拟主机中只有一个日志文件,也可能发生这种情况。
Apache 日志中的并发性
在里面常见日志指令的源代码,可以清楚地看到,日志记录是通过apr_file_write_full()
API 调用从内部缓冲区记录到日志文件的(参见flush_log()
第 1135 行左右)。
深入检查源代码后发现,如果单个日志事件会导致多行,则并发写入可能会混淆行,但不会混淆内容。然而,在普通的 CustomLog 指令中,这是不可能的。
此外,检查低级行为,我们还可以发现 apr 库(apache 的内部跨平台 API)使用了 ,apr_file_write()
它调用了已经是原子的 -write()
调用。这些发生在块大小中,这些块可能与系统页面大小相同,即 4096。普通的 CustomLog 指令实际上永远不会变得这么长。
如果你以某种方式欺骗 Apache 日志记录来创建极其糟糕的日志条目,行数超过页面大小(4096),我不会排除一些糟糕的日志的可能性。但是,我几乎可以肯定 apache 会对此采取一些措施。