Apache-2.2

具有多個 apache 伺服器或 CDN 的 Etag 配置 / Google 如何做 ETags?

  • March 17, 2010

我有一個由兩個 apache2 伺服器提供服務的應用程序,我想在靜態內容上配置 ETag。將來我還想使用 CDN。我看到這應該是一個問題,因為 Etag 資訊將因伺服器而異……

Apache 1.3 和 2.x 的 ETag 格式是 inode-size-timestamp。儘管給定文件可能跨多個伺服器駐留在同一目錄中,並且具有相同的文件大小、權限、時間戳等,但它的 inode 因一台伺服器而異。

因此,如果您使用多個網路伺服器來託管您的應用程序(就像您每天使用的 90% 的網路應用程序一樣),這應該是一個問題。但是我看到Google使用 Etags,當然他們使用多個伺服器和 CDN 和邊緣記憶體等……我得到任何記憶體的Google內容的 304 響應。他們是怎麼做到的呢?您如何解決多伺服器問題?有沒有辦法用 Apache 配置它?

您可以配置 Apache,使其不使用 inode 作為雜湊的一部分。請參閱FileETag指令。

目前的做法是刪除 ETags,這正是 OPs 文章中給出的原因。相反,您可以依賴其他記憶體標頭,即 Cache-Control 和 Expires,並無條件地記憶體資源(假設給定 URL 上的靜態內容是不可更改的,因此當內容必須更改時,您也可以給它一個新 URL)。Steve Souders 在 Yahoo! 期間為此建立了案例,並出版了一本關於此和其他性能改進的好書

如果您願意,*可以使用 ETags;*您只需要注意所有伺服器的配置完全相同,並且 ETag 是從與機器無關的東西生成的。這樣做的一種方法是從文件內容的雜湊或(文件名 + 大小)的雜湊中生成 ETag,正如 James 所寫的那樣。

我的猜測是——沒有任何證據——Google沒有使用第三方 CDN,他們只是在全球許多數據中心使用自己的伺服器。然後,他們在全球範圍內保持其網路伺服器的配置一致,並僅使用(上次修改時間 + 文件大小)之類的內容作為其 ETag 的基礎。

對於我們其他人來說,不使用 ETags 恕我直言更簡單更好。

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