Apache-2.2

對多個虛擬主機中的兩個使用相同的訪問日誌文件

  • May 25, 2019

出於某種原因,我需要為許多 Apache 虛擬主機中的兩個定義相同的訪問日誌文件。Apache Web Server 在技術上是否支持它?使用同一個日誌文件會不會有衝突?

<VirtualHost A>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>

<VirtualHost B>
...
CustomLog logs/AB_access_log common
...
</Virtualhost>

簡短的回答

實際上,是的。

小澄清

虛擬主機之間不會發生可能的競爭條件。它們可能發生在 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 會針對它做一些事情。

引用自:https://serverfault.com/questions/968840