了解缓存

本文档将说明如何实现调度程序缓存以及如何进行配置。

🏠目录

🔙上一页 配置文件说明

缓存目录

在基线安装中,我们使用以下默认缓存目录

  • 作者
    • /mnt/var/www/author
  • 发布者
    • /mnt/var/www/html

当每个请求遍历调度程序时,请求均遵循配置规则以使本地缓存版本响应符合条件的项目。

注意:

我们有意地将发布的工作负载与作者的工作负载分开,因为当 Apache 在 DocumentRoot 中查找文件时,Apache 并不知道文件来自哪个 AEM 实例。因此,即使您在作者场中禁用了缓存,如果作者的 DocumentRoot 与发布者相同,则它也将从缓存中提供存在的文件。这意味着您将从已发布缓存中提供作者文件,这会为访客带来非常糟糕的混合匹配体验。

 

为不同的发布内容保留单独的 DocumentRoot 目录也是一个非常糟糕的主意。您必须创建多个在 clientlib 之类的站点之间无区别的重新缓存项目,并且还必须为您设置的每个 DocumentRoot 设置一个复制刷新代理。每次页面激活都会增加刷新开销的量。依靠文件的命名空间及其完整的缓存路径,可避免为已发布的站点使用多个 DocumentRoot。

配置文件

调度程序控制所有场文件的 /cache { 部分中符合可缓存条件的内容。在 AMS 基线配置场中,您将看到如下所示的包含项:

/cache { 
    /rules { 
        $include "/etc/httpd/conf.dispatcher.d/cache/ams_author_cache.any" 
    }

在创建缓存何种内容或不缓存何种内容的规则时,请参阅此处的文档

缓存作者

我们已经见过许多不缓存作者内容的实施。这些实施会错过对性能和作者响应度的大幅提升。

我们来探讨一下配置作者场以进行正确缓存时采取的策略。

以下是作者场文件的基本作者 /cache { 部分:

/cache { 
    /docroot "/mnt/var/www/author" 
    /statfileslevel "2" 
    /allowAuthorized "1" 
    /rules { 
        $include "/etc/httpd/conf.dispatcher.d/cache/ams_author_cache.any" 
    } 
    /invalidate { 
        /0000 { 
            /glob "*" 
            /type "allow" 
        } 
    } 
    /allowedClients { 
        /0000 { 
            /glob "*.*.*.*" 
            /type "deny" 
        } 
        $include "/etc/httpd/conf.dispatcher.d/cache/ams_author_invalidate_allowed.any" 
    } 
}

此处需要注意的重要事项是,将 /docroot 设置为作者的缓存目录。

注意:

确保作者的 .vhost 文件中的 DocumentRoot 与场 /docroot 参数匹配。

缓存规则包含语句包括 /etc/httpd/conf.dispatcher.d/cache/ams_author_cache.any 文件,其中包含以下规则:

/0000 { 
 /glob "*" 
 /type "deny" 
} 
/0001 { 
 /glob "/libs/*" 
 /type "allow" 
} 
/0002 { 
 /glob "/libs/*.html" 
 /type "deny" 
} 
/0003 { 
 /glob "/libs/granite/csrf/token.json" 
 /type "deny" 
} 
/0004 { 
 /glob "/apps/*" 
 /type "allow" 
} 
/0005 { 
 /glob "/apps/*.html" 
 /type "deny" 
} 
/0006 { 
 /glob "/libs/cq/core/content/welcome.*" 
 /type "deny" 
}

在作者场景中,内容一直在有目的地进行变化。您仅想缓存那些不会经常发生变化的项目。我们有缓存 /libs 的规则,因为它们是基线 AEM 安装的一部分,并且在您安装 Service Pack、累积修订包、升级或修补程序之前会有所变化。因此,缓存这些元素非常有意义,并且对于使用该站点的最终用户的作者体验也确实具有巨大的好处。

注意:

请记住,这些规则还缓存 /apps,这是自定义应用程序代码所在位置。如果您要在此实例上开发代码,那么在保存文件时会非常混乱,并且由于它提供了缓存的副本,因此看不到 UI 中是否会有所体现。这样做的目的是,如果您将代码部署到 AEM 中,这种情况也不会经常发生,并且您的部署步骤的一部分应该是清除作者缓存。同样,其好处是巨大的,可以使最终用户更快的运行可缓存代码。

ServeOnStale(亦称旧项目提供/SOS)

这是调度程序众多强大功能之一。如果发布者承受负载或无法响应,则通常会引发 502 或 503 http 响应代码。如果发生这种情况并且启用了此功能,则将指示调度程序仍然尽力提供仍保留在缓存中的内容,即使该内容不是新副本。如果您获取了某些内容,最好提供该内容,而不是仅仅显示不提供任何功能的错误消息。

注意:

请记住,如果发布者呈现器出现套接字超时或 500 错误消息,则不会触发此功能。如果无法访问 AEM,则此功能不起作用

可以在任意场中设置此设置,但只有将其应用于发布场文件才有意义。以下是场文件中已启用功能的语法示例:

/cache { 
    /serveStaleOnError "1"

使用带有查询参数/参数缓存页面

注意:

调度程序模块的常规行为之一是,如果一个请求的 URI 中具有查询参数(通常显示为 /content/page.html ?myquery=value),则会跳过缓存该文件,直接转向 AEM 实例。这是因为调度程序模块将该请求看作动态页面,不应缓存。这会对缓存效率产生不良影响

如果 AEM 中有些页面的地址行中带有 GET 参数/查询参数(这些参数可以帮助页面运行,但不会呈现不同的 html),则可以对这些页面使用此配置元素。

您可以设置调度程序忽略哪些参数并仍然缓存页面。

例如,某人构建了一个社交媒体深层链接引用机制,该机制使用 URI 中的参数引用来得知用户来自何处。

使用情况示例:

https://www.weretail.com/home.html?reference=android

https://www.weretail.com/home.html?reference=facebook

该页面 100% 可缓存,但由于存在参数而不会缓存。为了解决此问题,我们向场配置文件中添加了以下部分:

/cache { 
    /ignoreUrlParams { 
        /0001 { /glob "*" /type "deny" } 
        /0002 { /glob "reference" /type "allow" } 
    }

现在,当调度程序发现请求时,它将忽略请求中具有 ?reference 请求参数的情况,并继续缓存该页面。

缓存响应标头

很显然,调度程序会缓存 .html 页面和 clientlib,但是您知道吗,它还可以缓存特定响应标头以及具有相同名称但文件扩展名为 .h 的文件中的内容。这样不仅可以对内容进行下一个响应,还可以对来自缓存的响应标头进行响应。 

AEM 可以处理的远不止 UTF-8 编码

有时,项目具有一些特殊标头来帮助控制缓存 TTL 的编码详细信息和最后修改的时间戳。

默认情况下,这些值在缓存时会被删除,而 Apache httpd Webserver 将使用其常规文件处理方法来完成资产处理工作,该方法通常仅限于基于文件扩展名的 mime 类型猜测。

如果让调度程序缓存资产和所需的标头,则可以提供适当的体验,并确保所有详细信息都传递给客户端浏览器。

以下是带有指定要缓存的标头的场示例:

/cache { 
 /headers { 
  "Cache-Control" 
  "Content-Disposition" 
  "Content-Type" 
  "Expires" 
  "Last-Modified" 
  "X-Content-Type-Options" 
 } 
}

在该示例中,已配置 AEM 来提供 CDN 所需的标头,以了解何时使它的缓存失效。也就是说,AEM 现在可以根据标头来正确地指示使哪些文件无效。

注意:

请记住,您无法使用正则表达式或 glob 匹配。这是要缓存的标头的常量列表。仅在常量标头列表中放入您要缓存的标头。

自动无效宽限期

在 AEM 系统上,许多作者进行了大量页面激活活动,因此您可能会遇到竞争条件,在该条件下会发生重复失效。有大量重复的刷新请求是不需要的,您可以建立一定的容差,直到宽限期清除后才重复刷新。

运作方式示例:

如果您有 5 个请求使 /content/exampleco/en/ 失效,那么所有请求都将在 3 秒内发生。

禁用此功能后,您将使缓存目录 /content/exampleco/en/ 失效 5 次

启用此功能并设置为 5 秒后,将使缓存目录 /content/exampleco/en/ 失效一次

以下是将此功能配置为 5 秒宽限期的语法示例:

/cache { 
    /gracePeriod "5"

基于 TTL 的失效

调度程序模块的一个新功能是用于已缓存项目的基于生存时间 (TTL) 的失效选项。缓存项目时,它将查找缓存控制标头是否存在,并在缓存目录中生成一个具有相同名称和 .ttl 扩展名的文件。

以下是在场配置文件中配置该功能的示例:

/cache { 
    /enableTTL "1"
注意:

请记住,仍然需要配置 AEM 来发送 TTL 标头,以便调度程序使用它们。切换此功能仅使调度程序知道何时删除 AEM 已为其发送缓存控制标头的文件。如果 AEM 没有开始发送 TTL 标头,那么调度程序在这里就不会执行任何特殊操作。

缓存过滤规则

以下是要在发布者方缓存哪些元素的基线配置示例:

/cache{ 
    /0000 { 
        /glob "*" 
        /type "allow" 
    } 
    /0001 { 
        /glob "/libs/granite/csrf/token.json" 
        /type "deny" 
    }

我们希望让发布的站点尽可能多的缓存,甚至是缓存所有内容。

如果某些元素在缓存后破坏了体验,则可以添加规则以删除用于缓存该项目的选项。如上述示例所示,csrf 令牌没有必要缓存,已被排除在外。有关写入这些规则的详细信息可在此处查看

下一页 ➡ 使用和了解变量

Adobe 徽标

登录到您的帐户