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

标签 caching proxy reverse-proxy edge-side-includes

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

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

<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 格式。

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

最佳答案

设置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 优化动态部分。

关于caching - 反向代理 HTTP 请求的后处理? (如 Akamai 的 ESI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/328309/

相关文章:

php - 如何使用标签缓存MySQL数据以在需要时删除缓存?

ios - 缓存 JSON 请求图像以供离线使用的最佳方法是什么?

maven - 在 pom.xml 中设置 Maven 的代理(而不是在 settings.xml 中)

URL 重写后 Javascript 内容类型被更改

ssl - 如何使用 Redbird 反向代理配置安全 (HTTPS) 域

node.js - Express:使用信任代理获取用户IP

python - CherryPy - 静态文件的缓存

javascript - 强制客户端浏览器重新下载 ASP.NET Web 应用程序的 .css 和 .js 文件的优雅方式(无需完全禁用缓存)

proxy - Charles 代理 SSL 证书不起作用

安卓 : Proxy settings for MediaPlayer class