對多個虛擬主機中的兩個使用相同的訪問日誌文件
出於某種原因,我需要為許多 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 會針對它做一些事情。