2008-11-30 86 views
6

我们运行一个相对较高容量的内容网站。与大多数内容网站一样,每个网页的大部分都是相对静态的。这些文章很少改变,使它们成为某种形式的静态/边缘缓存的理想选择。但是,有两个大问题。辅助页面元素(导航栏,最近的内容列表等)变化非常频繁,快速使“完整”缓存页面失效。我们在页面中包含更多动态位,比如用户特定的信息等等也是很常见的。反向代理HTTP请求的后处理? (如Akamai的ESI)

有一个反向代理/负载均衡器可以处理后期内容,让我们处理包含代理/边缘。对后端的初始请求会返回一个粗略的模板,然后代理软件可以处理该模板以完成它。该标记可能是这个样子:

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

什么,你会在这个例子看到的是红宝石的一个小一点,其基于cookie的值所包含的文件,然后返回一个哈希的URL来拉,一个超时,以及一些默认的文本显示在一个错误的事件。从理论上讲,所有的包含都可以异步地被请求。

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

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

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

回答

2

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

编辑:

许多Web服务器支持某种形式的SSI(服务器端包含),这个功能可以让你添加一些标签到HTML的脚本非常有限的形式,更简单,速度比(及以上) PHP。使用它你可以设置大部分内容的静态页面,对于'小动态部分',SSI标签引用其他地方生成的动态页面。

我特别喜欢nginx作为前端几乎任何东西。它的速度非常快,对资源和可扩展性的要求很高(想想清洁和更稳定的代码)。作者将其描述为不是通用的网络服务器;但是作为代理前端。后端可以是HTTP服务器(通常是Apache)或FastCGI进程(PHP,Python,Perl,或其他),或者是一个或两个服务器场。

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

+0

你能扩充这个答案吗?这听起来并不像我想要的那么多,但可能我错过了一些东西。 – MrKurt 2008-11-30 20:50:32

1

我知道一些人已经写了关于使用nginx SSI和memcache nginx模块来拼接内容片段。它比ESI等更有限,但仍然有用。

2

因此,事实证明,清漆已经(并且有)基本的ESI支持,几乎可以满足我想要的任何事情。如果任何人需要做一些ESI的东西,清漆似乎工作得很好。这是非常基本的,但仍然很棒。

1

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