6

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

拥有一个反向代理/负载均衡器来对内容进行后处理并让我们在代理/边缘处理包含内容会非常好。对后端的初始请求将返回一个粗略的模板,然后代理软件可以处理该模板以完成它。标记可能看起来像这样:

<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>

您将在该示例中看到一小部分 Ruby,它根据 cookie 值确定包含的文件,然后返回带有要拉入的 URL、超时和一些默认文本的哈希值,以在出现异常时显示错误。理论上,所有包含也可以异步请求。

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

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

所以问题是:有什么可以让我做我想做的事?还有其他人以这种方式做事吗?

4

4 回答 4

2

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

编辑:

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

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

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

于 2008-11-30T05:00:58.853 回答
2

所以事实证明,Varnish 拥有(并且拥有)基本的 ESI 支持,几乎可以满足我的所有需求。如果有人需要做一些 ESI 的东西,Varnish 似乎很适合它。这是非常基本的,但仍然很棒。

于 2010-04-22T17:55:08.447 回答
1

我知道有些人写过关于使用 nginx SSI 和 memcache nginx 模块来拼接内容片段的文章。它比 ESI 之类的限制要多得多,但仍然有用。

于 2008-11-30T07:50:16.937 回答
1

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

于 2011-04-13T16:38:25.043 回答