Caching 反向代理HTTP请求的后处理?(如Akamai的ESI)

Caching 反向代理HTTP请求的后处理?(如Akamai的ESI),caching,proxy,amazon,reverse-proxy,edge-side-includes,Caching,Proxy,Amazon,Reverse Proxy,Edge Side Includes,我们经营一个相对高容量的内容网站。与大多数内容站点一样,每个页面的大部分内容都是相对静态的。这些文章很少更改,这使它们成为某种形式的静态/边缘缓存的良好候选。不过,有两个大问题。辅助页面元素(nav、最近的内容列表等)变化非常频繁,很快使“完整”缓存页面失效。我们在页面中包含更多的动态信息也是很常见的,比如特定于用户的信息等等 如果有一个反向代理/负载平衡器,可以对内容进行后期处理,并让我们在代理/边缘处理include,这将是非常好的。对后端的初始请求将返回一个粗略的模板,然后代理软件可以处理

我们经营一个相对高容量的内容网站。与大多数内容站点一样,每个页面的大部分内容都是相对静态的。这些文章很少更改,这使它们成为某种形式的静态/边缘缓存的良好候选。不过,有两个大问题。辅助页面元素(nav、最近的内容列表等)变化非常频繁,很快使“完整”缓存页面失效。我们在页面中包含更多的动态信息也是很常见的,比如特定于用户的信息等等

如果有一个反向代理/负载平衡器,可以对内容进行后期处理,并让我们在代理/边缘处理include,这将是非常好的。对后端的初始请求将返回一个粗略的模板,然后代理软件可以处理该模板以完成它。标记可能如下所示:

<html>
<body>
  <div id="content">
    Lorem ipsum whackem smackem.
    <%
      dynamic "http://related.content.service/this/story"
    %>
  </div>
  <div id="sidebar">
    <%
      dynamic do |request|
        url = "http://my.user.service/user-widget.html"
        if request.cookies.contains?("user_token")
          url = "http://my.user.service/" + request.cookies["user_token"] + "/user-widget.html"
        end

        error_text = "User service not available"
        { :url => url, :timeout => 500, :error => error_text }
      end
    %>
  </div>
</body>
</html>

Lorem ipsum砰的一声。
url,:timeout=>500,:error=>error\u text}
结束
%>
在该示例中,您将看到一小块Ruby,它根据cookie值确定包含的文件,然后返回一个包含要拉入的URL的哈希、一个超时以及一些在发生错误时显示的默认文本。理论上,也可以异步请求所有include

我的理解是亚马逊就是这样做的。各种页面组件由后端服务生成,具有严格的超时限制,以确保整体页面速度。我希望他们的CDN服务会包括这样的内容,但事实并非如此

有一个W3规范的边缘包括(ESI)几乎是我想要的。然而,很少有人支持它。它可以通过Akamai获得,有一些Oracle软件可以做到这一点,开源Varnish缓存有一个非常基本的实现。它也是一种非常丑陋的XML格式


所以问题是:有什么能让我做我想做的?还有其他人这样做吗?

将Nginx设置为前端,并使用SSI选择页面的动态部分。动态源可以是HTTP服务器(如Apache)或FastCGI服务器(如PHP或Django)

编辑:

许多Web服务器支持某种形式的SSI(服务器端包括),此功能允许您将一些标记作为一种非常有限的脚本形式添加到HTML中,比PHP更简单、更快(而且更旧)。使用它,您可以设置包含大部分内容的静态页面,对于“小动态部分”,SSI标记引用在其他地方生成的动态页面

我特别喜欢nginx作为几乎任何东西的前端。它速度快,资源少,可扩展性强(想想lighthttp,它的代码更干净、更稳定)。作者描述它不是一个通用的Web服务器;但作为代理前端。后端可以是HTTP服务器(通常是Apache)或FastCGI进程(PHP、Python、Perl等等),也可以是其中一个或两个进程的集群


memcached模块令人惊讶,它使用memcached(这是最快、最可扩展的通用分布式哈希表)将网页与URL直接关联,不涉及磁盘访问。由于memcached可以从Web服务器本身的“外部”访问,因此它甚至可以用于动态页面(给定一个合理的URL/资源映射);但我认为这对你的情况没有多大帮助。在任何情况下,首先使用SSI,然后(如有必要)使用memcached优化动态部分。

我知道有一些人写过关于使用nginx SSI和memcache nginx模块将内容片段拼接在一起的文章。它比ESI这样的东西要有限得多,但仍然很有用。

因此,Varnish有(并且有)基本的ESI支持,几乎可以实现我想要的所有功能。如果有人需要做一些ESI的东西,Varnish似乎很适合。它非常基本,但仍然很棒。

Akamai有一个边缘计算解决方案,允许J2EE在边缘运行。今天的其他替代方案包括任何云计算服务——Rackspace和亚马逊是这个市场上的两个参与者。理想情况下,您可以使用CDN和云计算的组合来获得所需的结果。此外,您可以选择在页面模板加载后通过web服务异步提供动态内容,然后使用html模板缓存静态页面内容

你能详细说明这个答案吗?听起来它并没有给我很多我想要的,但我可能错过了一些东西。啊,这稍微有点帮助。但是,它并不能真正帮助我有条件地包含内容,这使得它对我感兴趣的场景类型不太有用。请记住,SSI可以插入整个页面的“内容”可以由任何后端服务器动态生成。