Etagconfiguration与多个Apache服务器或CDN / Google如何做ETags?

我有一个从两个Apache2服务器提供的应用程序,我想在静态内容上configurationETags。 将来我还想使用CDN。 我看到这应该是一个问题,因为Etag信息将不同,从服务器到服务器…

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

因此,如果您使用多个networking服务器托pipe您的应用程序(例如每天使用的networking应用程序的90%),则应该是一个问题。 然而,我看到谷歌使用Etags,当然他们使用多个服务器和CDN和边缘caching等…我得到一个304响应任何caching的谷歌内容。 他们是如何做到的呢? 你如何解决多服务器问题? 有没有办法用Apacheconfiguration这个?

您可以configurationApache,使其不将inode用作散列的一部分。 请参阅FileETag指令。

目前的做法是删除ETags ,正是由于OPs post中给出的原因。 相反,您可以依赖其他caching标题(即caching控制和过期),并无条件地caching资源(假设给定URL上的静态内容不可更改,所以当内容必须更改时,您也可以给它一个新的URL)。 史蒂夫·苏德斯(Steve Souders)在雅虎(Yahoo!)为此build立了案例,并发表了一本关于这个和其他性能改进的好书 。

可以使用ETags,如果你想; 你只需要非常小心,所有的服务器configuration完全一样,而ETags是从机器无关的东西生成的。 这样做的一种方法是从文件内容的散列或者(文件名+大小)的散列生成ETag,就像James写的那样。

我的猜测是 – 没有任何证据 – Google没有使用第三方CDN,他们只是在全球许多数据中心使用自己的服务器。 然后,他们保持Web服务器的configuration在全球范围内保持一致,只是使用类似(最后修改时间+文件大小)作为其ETag的基础。

对于我们其他人,不使用ETags是恕我直言,更简单,更好。