优化调度程序缓存

概述

本篇文章重点介绍 AEM 调度程序中的一些最新优化,以及如何以最佳方式利用这些优化。AEM 调度程序是一个缓存反向代理服务器,专门与 Adobe Experience Manager 配合使用。它可以安装在现有的 Web 服务器软件中,并作为一个模块来运行。截止到撰写这篇文章时,支持这种调度程序模块的服务器软件包括:Apache HTTP Server、Microsoft IIS 和 iPlanet。

调度程序缓存的工作方式

从根本上讲,AEM 调度程序是一个反向代理,其工作内容就是执行缓存、缓存刷新和缓存失效。  

请参阅以下相关链接,了解有关调度程序的更多详细信息:

  1. 调度程序的工作方式及安装方法
  2. 调度程序中可用的配置选项
  3. 关于调度程序工作方式的网络研讨会 - 请注意,演示资料中的部分信息依据的是调度程序的早期版本。
  4. 关于调度程序功能、CDN 用途及安全性的 Gems 网络研讨会
  5. 关于调度程序(4.1.9 版本以上)中新增功能的 Gems 会议

优化调度程序缓存

以下是一些优化调度程序缓存的方法:

  1. 缓存几乎所有内容 - 这意味着凡是用户请求超过一次以上的内容,都将进行缓存。
  2. 缓存不同时段的个性化内容 - 如果您的站点包含个性化内容,则可以考虑在 AEM 应用程序中运用 Apache Sling Dynamic Include,以借助 Ajax(浏览器级别的异步 JavaScript 和 XML 调用)、SSI(Web 服务器级别的 Server Side Include)和 ESI(CDN 级别的 Edge-side Include)来缓存不同时期页面的不同部分。
  3. 绝不删除活动调度程序上的调度程序缓存 - 如果调度程序正在提供实时内容,那么当您删除相关缓存时,将会导致大量请求充斥在 AEM 中。正因如此,绝不要删除活动调度程序上的调度程序缓存。
  4. 准备好缓存 - 删除调度程序缓存之前,先将调度程序与负载平衡器分离,接着删除缓存,然后运行爬网工具来缓存调度程序上的文件,最后再将调度程序与负载平衡器相连。
  5. 缓存错误页面 - 利用 DispatcherPassError 1(特定于 Apache Web Server)指令,可提供来自调度程序缓存的错误页面(例如,404 错误)。
  6. 除了预先压缩的文件之外,运用 GZip 压缩所有文件类型 - 在 Apache Web Server 中,可以使用 mod_deflate,但要确保没有设置 Vary: User-Agent 标头。在 Microsoft IIS 中,使用动态压缩
    Apache 配置示例(仅指定具体内容类型,以回避预先压缩的文件类型):
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
  7. 在 /cache 配置中启用 /serveStaleOnError - 当 AEM 实例出现错误时,提供旧的缓存文件。
  8. 在 /cache 配置中添加 /gracePeriod - 定义在发布最后一个内容事件(“激活”)后,仍然从缓存中提供过时、自动失效资源的时间(以秒为单位)。这种方法可以在类似“树型激活”这样发布大量内容的活动期间,减少返回到 publish 实例中的请求数量。
  9. /ignoreUrlParams 中添加规则 - 忽略应用程序不需要或不使用的查询字符串参数。这样一来,即使是出现了查询字符串,也依然允许缓存 URL。
  10. 缓存 Cache-Control 和 Last-Modified 响应标头 - 使用 /headers 配置来缓存 HTTP 响应标头 Cache-ControlLast-Modified(和/或 ETag 标头,如果从 AEM 发送)。这样会有助于简化和优化 CDN 和浏览器级别的缓存。缓存这些标头将会造成专门由 AEM 来设置这些标头,而不是 Web 服务器本身。请注意,在执行这项操作时,您需要开始通过您的 AEM 应用程序发送这些标头。
  11. 尽可能长时间地缓存内容减少返回到 AEM 的请求数量 - 通过启用所有刷新代理上的重新获取刷新,优化刷新请求。或者,使用 /enableTTL,并将 Cache-Control: max-age=... 标头设置为尽可能长时间地缓存文件。请参阅以下内容,了解关于这个主题的详细信息。

使用 TTL

从调度程序版本 4.1.11 开始,您可以在 .any 文件配置中设置 /enableTTL 1。该设置将要求调度程序遵守 HTTP Cache-Control 响应标头中设置的缓存到期时间。换言之,调度程序将发挥与 CDN 类似的功能,当文件过期时,会出现缓存失效的基本形态。在实施了这项操作并开始向来自 AEM 的所有响应发送 Cache-Control: max-age=... 后,就可以安全地禁用 publish 实例中的调度程序刷新代理。

禁用 publish 实例上的刷新代理后,您也许仍然希望能够刷新调度程序缓存。对于这种情况,可以使用 ACS Commons - Dispatcher Flush UI。该工具安装在 author 实例上。它为用户提供了一个 UI,用户可通过这个 UI 执行手动缓存刷新请求。

I. 步骤 - 启用 TTL(“生存时间”或到期)形式的失效:

  1. 修改 AEM 应用程序中的源代码,向所有未经设置的请求发送 Cache-Control 标头和 Last-Modified
  2. 安装调度程序版本 4.1.11 或更高版本。
  3. 在站点的 .any 文件配置中,设置 /enableTTL 1
  4. 设置 /headers 配置,以缓存 Cache-ControlLast-Modified 标头。
  5. 重新启动 Web 服务器。

II. 禁用 publish 实例上的调度程序刷新代理:

现在,调度程序将使用 Cache-Control 标头来控制缓存文件的失效。在这种情况下,不再需要通过 publish 实例来执行调度程序刷新。

  1. 转到每个 publish 实例上的 /etc/replication/agents.publish.html。
  2. 转到每个刷新代理的配置页面,并禁用该代理。

III. 允许来自 author 实例的手动调度程序刷新请求:

既然禁用了刷新代理,您将完全依赖 Cache-Control 标头来控制调度程序上刷新内容的时间。您仍可以允许用户发布调度程序缓存的手动刷新:

  1. 在 author 实例上安装 ACS Commons - 调度程序刷新 UI
  2. 在 author 实例上配置刷新代理。
  3. 在每个代理配置中,将触发器 => 忽略默认设置选项设置为“启用”。当用户单击 AEM UI 中的(取消)发布(取消)激活时,此选项将要求刷新代理忽略用户操作。

重新获取调度程序刷新

为了优化调度程序刷新请求,所有的调度程序刷新代理都应当启用一项名为“重新获取刷新”的功能。

要启用重新获取调度程序刷新,请执行以下操作:

  1. 转到 http://aemhost:port/crx/packmgr/index.jsp,并以 admin 的身份登录。
  2. 此处下载该程序包。
  3. 将该程序包上载并安装到程序包管理器。
  4. 转到您的调度程序刷新代理配置页面。例如 /etc/replication/agents.author/flush.html
  5. 单击编辑
  6. 设置以下内容
    • 序列化类型 = 重新获取调度程序刷新
    • 扩展 => HTTP 方法 = POST
  7. 单击保存

请注意,以上安装的程序包只是一个基本示例。若要自定义并优化重新获取刷新,您可以修改所发送的 URI 列表。相关代码为开源代码,您可以在此处找到。该代码将 URI 列表作为参数添加到请求的正文中,以通知调度程序要重新获取的路径。您可以根据应用程序的要求添加更多的路径,以优化站点的缓存能力。

关于重新获取刷新的更加详细的说明

通常情况下,调度程序刷新通过删除文件来运作:

  1. 触控 .stat 文件
  2. 删除 /content/foo.*
  3. 删除 /content/foo/_jcr_content

由于这些文件已在步骤 2 中删除,当用户下次请求 /content/foo.html 或 /content/foo.json 之类的文件时,尽管会“重新获取”相关文件,但是在文件得到缓存之前,后续针对同一文件的请求依然会发送到 publish 实例中。假如响应速度缓慢,或者遇到像主页这样的大流量页面,可能会导致 publish 实例层遭到“淹没”。

要解决此问题,应启用一个名为“重新获取”的调度程序功能。该功能允许您发送一个应当让调度程序主动“重新获取”和替换(而不是删除)的 URI 列表。

请参阅这个演示录像中的有关部分(时间段为 22:41-27:05),查看这项功能的工作方式及配置方法。

Adobe 徽标

登录到您的帐户