per*_*ism 5 web-server static-content cdn apache-2.2
我有一个由两台 apache2 服务器提供服务的应用程序,我想在静态内容上配置 ETag。将来我也想使用 CDN。我看到这应该是一个问题,因为 Etag 信息因服务器而异......
Apache 1.3 和 2.x 的 ETag 格式是 inode-size-timestamp。尽管给定的文件可能跨多台服务器驻留在同一目录中,并且具有相同的文件大小、权限、时间戳等,但它的 inode 因一台服务器而异。
因此,如果您使用多个网络服务器来托管您的应用程序(就像您每天使用的 90% 的网络应用程序一样),这应该是一个问题。但是我看到谷歌使用 Etags,当然他们使用多个服务器和 CDN 和边缘缓存等......我收到任何缓存的谷歌内容的 304 响应。他们是怎么做到的呢?您如何解决多服务器问题?有没有办法用Apache配置它?
当前的做法是删除 ETags,正是出于 OP 帖子中给出的原因。相反,您可以依赖其他缓存标头,即 Cache-Control 和 Expires,并无条件地缓存资源(假设给定 URL 上的静态内容不可更改,因此当内容必须更改时,您也给它一个新 URL)。Steve Souders 在 Yahoo! 期间为此建立了案例,并出版了一本关于此和其他性能改进的好书。
如果你愿意,你可以使用 ETags;您只需要注意所有服务器的配置完全相同,并且 ETag 是从与机器无关的东西生成的。这样做的一种方法是从文件内容的散列或(文件名 + 大小)的散列中生成 ETag,正如 James 所写的那样。
我的猜测是——没有任何证据——谷歌没有使用第三方 CDN,他们只是在全球许多数据中心使用自己的服务器。然后他们保持他们的网络服务器的配置在全球保持一致,并使用类似(上次修改时间+文件大小)作为他们 ETag 的基础。
对于我们其他人来说,不使用 ETags 恕我直言更简单更好。