如何优化Dispatcher缓存?
本文提供了有关优化Dispatcher缓存的各种方法的详细说明。 它进一步描述了启用TTL(“生存时间”或到期)样式无效、禁用Dispatcher刷新代理、重新获取Dispatcher刷新等操作的步骤。
描述 description
环境
Adobe Experience Manager
问题/症状
本文重点介绍AEM Dispatcher中的最新优化以及如何最好地利用这些优化。 AEM Dispatcher是专为与Adobe Experience Manager一起使用而设计的缓存反向代理服务器。 它可以作为现有Web服务器软件中的模块安装和运行。 在撰写本文时,Apache HTTP Server、Microsoft IIS和iPlanet支持Dispatcher模块。
解决方法 resolution
Dispatcher缓存如何工作?
在最基本的层面上,AEM Dispatcher是一个反向代理,它通过执行缓存、缓存刷新和缓存失效来工作。
有关Dispatcher的更多详细信息,请参阅相关链接:
- Dispatcher的工作方式以及如何安装。
- Dispatcher中可用的配置选项。
- 关于Dispatcher如何工作的网络研讨会 — 请注意,演示文稿中的某些信息基于旧版本的Dispatcher。
- 有关Dispatcher功能、CDN使用和安全性的Gems网络研讨会。
- 有关Dispatcher中新功能的Gems会话(v4.1.9之后)。
优化Dispatcher缓存
以下是优化Dispatcher缓存的一些方法:
-
缓存几乎所有内容 — 这意味着缓存用户多次请求的任何内容。
-
缓存不同时间段的个性化内容 — 如果您的网站有个性化内容,请考虑在您的AEM应用程序中使用Apache Sling Dynamic Include以利用Ajax(浏览器级别的异步JavaScript和XML调用)、SSI(Web服务器级别的服务器端包含)和ESI(CDN级别的Edge端包含)来缓存不同时间段的页面的不同部分。
-
永远不要删除实时Dispatcher上的Dispatcher缓存 — 如果Dispatcher正在提供实时内容并且您删除了缓存,则会导致大量请求返回AEM。 因此,绝不应该在实时Dispatcher上删除Dispatcher缓存。
-
填充缓存 — 在删除Dispatcher缓存之前,先从负载平衡器中提取Dispatcher,删除缓存,然后运行网络爬虫工具在Dispatcher上缓存文件,然后再将其放在负载平衡器中。
-
缓存错误页面 — 利用DispatcherPassError 1 (Apache Web Server特定)指令从Dispatcher缓存中提供错误页面,例如404。
-
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
-
在/cache配置中启用/serveStaleOnError — 当AEM实例出现错误时提供旧缓存文件。
-
将/gracePeriod 添加到/cache配置 — 定义在最后一次内容发布事件(“激活”)之后,过时的、自动失效的资源仍可从缓存中获得服务的秒数。这减少了在大型内容发布活动(例如“树激活”)期间返回发布实例的请求数量。
-
将规则添加到/ignoreUrlParams — 忽略应用程序不需要或不使用的查询字符串参数。即使存在查询字符串,也允许缓存 URL。
-
缓存Cache-Control和Last-Modified响应标头 — 使用 /标头 配置缓存HTTP响应标头 Cache-Control 和 Last-Modified (和/或 ETag 标头(如果您从AEM发送)。这有助于在 CDN 和浏览器级别简化和优化缓存。缓存这些标头使得只有 AEM 设置标头,而不是 Web 服务器本身。 请注意,执行此操作时,您需要开始从AEM应用程序发送标头。
-
尽可能长时间地缓存内容 和 减少返回AEM的请求 — 通过启用所有刷新代理上的重新获取刷新功能优化刷新请求。 请参阅下面标题为 重新获取Dispatcher Flush 的部分。 或使用 /enableTTL 并设置 Cache-Control: max-age=… 标头来尽可能长时间地缓存文件。有关此话题的详细信息,请参阅以下内容。
使用TTL
从Dispatcher版本4.1.11开始,可以在任何文件配置中设置/enableTTL 1。 此设置使Dispatcher遵守HTTP Cache-Control响应标头中设置的缓存过期时间。 换句话说,Dispatcher的功能类似于CDN,当文件过期时,会发生主要形式的缓存失效。 一旦您实施此操作,并开始发送 Cache-Control: max-age=… 对于来自AEM的所有响应,您可以在发布实例中安全地禁用Dispatcher刷新代理。
在发布实例上禁用刷新代理后,您可能仍希望能够刷新Dispatcher缓存。在这种情况下,您可以使用ACS Commons – Dispatcher 刷新 UI。此工具安装在作者实例上。它为用户提供 UI,用户可以在其中执行手动缓存刷新请求。
一、启用 TTL(“生存时间”或到期)样式失效的步骤:
- 修改AEM应用程序中的源代码,针对尚未设置的所有请求发送 Cache-Control 标头和 Last-Modified 。
- 安装Dispatcher 4.1.11或更高版本。
- 在站点的任何场配置中设置 /enableTTL 1。
- 设置 /标头 配置以缓存 Cache-Control 和 Last-Modified 标头。
- 重新启动 Web 服务器。
二、在发布实例上禁用Dispatcher刷新代理:
Dispatcher现在将使用Cache-Control标头来控制缓存文件的失效。 既然是这种情况,则不再需要从发布实例中刷新Dispatcher 。
- 前往每个发布实例上的/etc/replication/agents.publish.html 。
- 前往每个刷新代理的配置并禁用该代理。
三、允许来自创作实例的手动Dispatcher刷新请求:
现在刷新代理已禁用,您将完全依赖 Cache-Control 标头来控制何时在Dispatcher上刷新内容。 您仍然可以允许用户手动刷新Dispatcher缓存:
- 安装ACS Commons – 作者实例上的 Dispatcher 刷新 UI。
- 在作者实例上配置刷新代理。
- 在每个代理配置中,设置 触发器 =
>
忽略默认的 选项已启用。 此选项使用户在 AEM UI 中单击 (取消)发布 或者 (取消)激活 时忽略刷新代理。
正在重新获取Dispatcher刷新
为了优化Dispatcher刷新请求,所有Dispatcher刷新代理都应该启用一个称为重新获取刷新的功能。
要启用重新获取Dispatcher刷新,请执行以下操作:
-
前往 http://aemhost:port/crx/packmgr/index.jsp 并以管理员身份登录。
-
在此处下载文档包。
-
将包上载并安装到包管理器。
-
转到Dispatcher刷新代理配置。 例如:/etc/replication/agents.author/flush.html
-
单击 编辑。
-
设置以下内容
- 序列化类型=重新获取 Dispatcher 刷新
- 扩展 =
>
HTTP方法 = POST
-
单击 保存
注意 — 上面安装的软件包只是一个基本示例。要自定义和优化重新获取刷新,您可以修改它发送的 URI 列表。代码是开源的,可见此处。 该代码会将URI列表作为参数添加到请求正文中,告诉Dispatcher要重新获取哪些路径。 您可以根据应用程序要求添加更多路径,以优化站点的缓存功能。
重新获取刷新的详细说明
通常,Dispatcher刷新通过删除文件来工作:
- 触控.stat文件
- 删除/content/foo。*
- 删除/content/foo/_jcr_content
由于文件在步骤2中被删除,下次用户请求/content/foo.html或/content/foo.json等文件时,当“重新获取”文件时,随后对同一文件的请求也将发送到发布实例,直到文件被缓存。对于响应缓慢或流量较大的页面(例如主页),这可能会导致发布实例层泛滥。
要解决此问题,请启用Dispatcher的一项称为重新获取的功能。 此功能允许您发送Dispatcher应主动“重新获取”并替换而不是删除的URI列表。
请参阅该演示录音中的 22:41-27:05,获取有关它如何工作以及如何配置的演示。