使用多个 apache 服务器或 CDN 进行 Etag 配置/Google 如何进行 ETag ?

使用多个 apache 服务器或 CDN 进行 Etag 配置/Google 如何进行 ETag ?

我有一个由两个 apache2 服务器提供服务的应用程序,我想在静态内容上配置 ETag。将来我还想使用 CDN。我认为这应该是一个问题,因为 Etag 信息在不同的服务器之间会有所不同...

Apache 1.3 和 2.x 的 ETag 格式为 inode-size-timestamp。尽管给定文件可能位于多个服务器的同一目录中,并且具有相同的文件大小、权限、时间戳等,但它的 inode 在不同的服务器之间是不同的。

因此,如果您使用多个 Web 服务器来托管您的应用(您每天使用的 Web 应用中有 90% 都是这样),那么这应该是一个问题。但是我看到 Google 使用 Etags,而且他们肯定使用多个服务器和 CDN 以及边缘缓存等……对于任何缓存的 Google 内容,我都会收到 304 响应。他们是怎么做到的?您如何解决多服务器问题?有没有办法用 Apache 来配置它?

答案1

您可以配置 Apache,使其不使用 inode 作为哈希的一部分。请参阅文件ETag指示。

答案2

当前的做法是删除 ETag,原因正是 OP 帖子中给出的。相反,您可以依赖其他缓存标头,即 Cache-Control 和 Expires,并无条件缓存资源(假设给定 URL 上的静态内容不可更改,因此当内容必须更改时,您也会为其提供新的 URL)。Steve Souders 在 Yahoo! 期间为此建立了案例,并发表了一篇很好的了解此项改进和其他性能改进的书籍

如果需要,可以使用 ETag;您只需注意确保所有服务器的配置完全相同,并且 ETag 是从与机器无关的东西生成的。一种方法是从文件内容的哈希值或 (文件名 + 大小) 的哈希值生成 ETag,正如 James 所写。

我的猜测是——没有任何证据——Google 没有使用第三方 CDN,他们只是在世界各地的许多数据中心使用自己的服务器。然后,他们在全球范围内保持其网络服务器的配置一致,并使用(上次修改时间 + 文件大小)之类的东西作为其 ETag 的基础。

对于我们其他人来说,我认为不使用 ETag 更简单、更好。

相关内容