我一直在赶上Scaling Rails的截屏视频。在第 11 集中介绍了高级 HTTP 缓存(使用反向代理缓存,如 Varnish 和 Squid 等),他们建议仅在您已经用尽 Rails 应用程序中的页面、动作和片段缓存的可能性后才考虑使用反向代理缓存(以及 memcached 等,但这与这个问题无关)。
我不太明白的是,使用 HTTP 反向代理缓存如何为已经使用页面缓存的应用程序提供性能提升。为了简化问题,假设我在这里谈论的是单个主机。
这是我对这两种技术如何工作的理解(也许我错了):
使用页面缓存,Rails 进程最初会被命中,然后生成一个静态 HTML 文件,该文件由 Web 服务器直接为后续请求提供服务,只要该请求的缓存有效。如果缓存已经过期,那么 Rails 会再次被命中并重新生成静态文件,更新的内容为下一个请求做好准备
使用 HTTP 反向代理缓存,当代理需要确定内容是否过时时,Rails 进程就会受到影响。这是使用各种 HTTP 标头完成的
ETag
,例如Last-Modified
等。如果内容是新鲜的,那么 Rails 会使用 HTTP 304 Not Modified 响应代理,并且代理会将其缓存的内容提供给浏览器,或者更好的是,使用自己的 HTTP 304 响应. 如果内容是陈旧的,那么 Rails 将更新的内容提供给缓存它的代理,然后将其提供给浏览器
如果我的理解是正确的,那么页面缓存不会导致 Rails 进程的命中率降低吗?没有那么多来回来确定内容是否过时,这意味着比反向代理缓存更好的性能。为什么你可以结合使用这两种技术?