Azure 应用服务中的本地缓存

小窍门

您还可以在 Azure 中向 Microsoft Copilot 提问这些问题:

  • 本地缓存如何在 Azure 应用服务中工作?
  • 在 Azure 应用服务中使用本地缓存有什么好处?
  • 在 Azure 应用服务中使用本地缓存有什么限制?

若要在 Azure 中找到 Copilot,请在 Azure 门户 工具栏上选择 Copilot

Azure 应用服务内容存储在 Azure 存储中,并作为持久内容共享公开。 此设计适用于各种应用,具有以下属性:

  • 内容在应用的多个虚拟机(VM)实例之间共享。
  • 内容是持久的,正在运行的应用可以修改它。
  • 日志文件和诊断数据文件位于同一共享内容文件夹下。
  • 发布新内容会直接更新内容文件夹。 可以通过源代码管理管理器(SCM,也称为 Kudu)网站和正在运行的应用立即查看相同的内容。 但是,某些技术(如 ASP.NET)可能会在某些文件更改时启动应用重启以加载最新内容。

尽管许多应用程序使用这些功能中的一个或多个,但某些应用程序需要一个高性能、只读的内容存储系统,以确保高可用性运行。 此类应用可以通过利用运行在 VM 实例上的本地缓存获益。

Azure 应用服务中的本地缓存功能提供内容的 Web 角色视图。 存储内容是在站点启动后异步创建的,而该内容是对存储内容进行写后即丢弃式缓存的结果。 缓存准备就绪后,站点将切换到针对缓存内容运行。

使用本地缓存的应用可以通过以下方式受益:

  • 它们不受与访问 Azure 存储中内容相关的延迟的影响。
  • 连接到存储时出现问题不会影响它们,因为只读副本在本地缓存。
  • 由于存储共享中的更改,他们经历了较少的应用重启。

注释

函数应用或容器化应用服务应用不支持本地缓存功能,例如 在 Windows 容器 或内置或自定义 Linux 容器中。 可用于这些应用类型的功能的一个版本是 应用缓存

应用服务的 F1 和 D1 定价层也不支持本地缓存功能。

本地缓存如何更改应用服务的行为

配置本地缓存会导致以下更改:

  • D:\home 现在指向本地缓存,该缓存在应用启动时在 VM 实例上创建。 D:\local 继续指向特定于 VM 的临时存储。

  • 本地缓存包含共享内容存储中的 /site 一次性副本和 /siteextensions 文件夹。 这些文件夹分别位于D:\home\siteD:\home\siteextensions。 这些文件会在应用启动时复制到本地缓存。

    默认情况下,这两个文件夹的大小限制为 1 GB,但可以将其增加到 2 GB。 随着缓存大小的增加,加载缓存需要更长的时间。 如果将本地缓存限制增加到 2 GB,并且复制的文件超过此最大大小,应用服务会以无提示方式忽略本地缓存并从远程文件共享读取。

    重要

    如果复制的文件超出了本地缓存的定义大小限制,或者未定义任何限制,则部署和交换作可能会失败并出现错误。 有关详细信息,请参阅本文后面的 有关大小限制的常见问题解答

  • 本地缓存是读/写的。 但是,当应用在 VM 之间移动或重启时,将放弃任何修改。 不要使用本地缓存来存储任务关键型数据。

  • D:\home\LogFilesD:\home\Data 包含日志文件和应用数据。 这些文件夹存储在 VM 实例本地,并定期复制到共享内容存储。 虽然应用可以通过写入到这些文件夹来保存日志文件和数据,但复制过程是尽最大努力的。 如果 VM 实例突然停止响应,则日志文件和数据可能会丢失。

  • 尽最大努力复制会影响日志流式处理。 在流式传输的日志中,最多可以观察到一分钟的延迟。

  • 在共享内容存储中,使用本地缓存的应用的LogFilesData文件夹结构会发生变化。 现在有一些子文件夹,其名称由唯一标识符和时间戳组成。 每个子文件夹对应于应用所在的或正在运行的 VM 实例。

  • 其他文件夹 D:\home 保留在本地缓存中,不会复制到共享内容存储。

  • 通过任何受支持方法的应用部署都会直接发布到持久的共享内容存储库。 要刷新本地缓存中的D:\home\siteD:\home\siteextensions文件夹,您必须重启应用。 有关无缝生命周期,请参阅本文后面的 有关最佳做法的部分

  • SCM 网站的默认内容视图继续反映共享内容存储。

注释

如果使用 Java(Java SE、Tomcat 或 JBoss EAP),则默认情况下,Java 构件(.jar、.war 和 .ear 文件)将会被本地复制到工作节点。 如果 Java 应用程序依赖于对其他文件的只读访问权限,则设置为JAVA_COPY_ALLtrue这样也会复制这些文件。 如果启用了本地缓存,则它优先于此特定于 Java 的行为。

启用本地缓存的方法

通过使用保留的应用设置的组合来配置本地缓存。 可以使用以下方法之一来设置这些应用设置。

使用 Azure 门户配置本地缓存

通过添加此应用设置,在每个 Web 应用上启用本地缓存: WEBSITE_LOCAL_CACHE_OPTION = Always

使用 Azure 资源管理器配置本地缓存

{
    "apiVersion": "2015-08-01",
    "type": "config",
    "name": "appsettings",
    "dependsOn": [
        "[resourceId('Microsoft.Web/sites/', variables('siteName'))]"
    ],

    "properties": {
        "WEBSITE_LOCAL_CACHE_OPTION": "Always",
        "WEBSITE_LOCAL_CACHE_SIZEINMB": "1000"
    }
}

更改本地缓存中的大小设置

默认情况下,本地缓存大小为 1 GB。 此大小包括从内容存储中复制的/site/siteextensions文件夹。 它还包括任何本地生成的日志和数据文件夹。

若要增加此限制,请使用应用设置 WEBSITE_LOCAL_CACHE_SIZEINMB。 每个应用最多可增加 2 GB(2,000 MB)的大小。 请记住,更大的缓存大小会增加加载缓存的时间。

使用本地缓存的最佳做法

建议将本地缓存与 过渡环境 功能结合使用。

以下过程表示使用本地缓存的最佳做法:

  1. 将值为 WEBSITE_LOCAL_CACHE_OPTION 的粘性应用设置 Always 添加到“生产”槽。 如果使用 WEBSITE_LOCAL_CACHE_SIZEINMB,请同时将该设置标记为生产槽的粘性设置。

  2. 创建一个暂存槽并发布到该槽。 通常,不要将过渡槽设置为使用本地缓存,这有助于实现无缝生成/部署/测试生命周期,同时仍为生产槽提供本地缓存优势。

  3. 在暂存槽中测试你的站点。

  4. 准备就绪后,在暂存槽与生产槽之间执行交换操作

粘性设置绑定到槽。 因此,将“暂存”槽交换成“生产”槽以后,该槽会继承本地缓存应用设置。 新交换的“生产”槽会在几分钟后以本地缓存为基础运行,并会在槽预热的过程中预热。 交换完成后,生产槽将针对本地缓存运行。

常见问题

如果超出本地缓存的大小限制,该怎么办?

如果复制的文件超出了本地缓存的大小限制,则应用会还原为从远程共享读取。 下表显示了详细信息。

本地缓存大小 复制的文件 结果
≤ 2 GB ≤本地缓存大小 从本地缓存读取。
≤ 2 GB > 本地缓存大小 从远程共享读取。

部署和交换操作可能会失败并发生错误。

如何判断应用是否可以从本地缓存中受益?

如果满足以下所有条件,则本地缓存非常适合:

  • 你的应用需要高性能可靠的内容存储。
  • 应用不使用内容存储在运行时写入关键数据。
  • 总大小小于 2 GB。

要检查您的/site/siteextensions文件夹的总大小,可以使用站点扩展 Azure Web Apps 磁盘使用情况

如何判断我的站点是否切换到使用本地缓存?

当您将本地缓存用于暂存环境时,交换操作需要等到本地缓存预热完成后才能结束。 若要验证站点是否针对本地缓存运行,请检查工作进程环境变量 WEBSITE_LOCALCACHE_READY。 若要跨多个实例检查此变量,请参阅 Kudu 提供的工作进程环境变量说明

为什么我的应用不反映新发布的更改?

如果应用使用本地缓存,则必须重启站点以加载最新更改。 如果不想直接将更改发布到生产站点,请考虑使用部署槽位,如前面部分介绍的最佳做法所述。

注释

从程序包运行部署选项与本地缓存功能不兼容。

我的日志在哪里?

使用本地缓存时,日志和数据文件夹的结构会略有变化。 子文件夹现在嵌套在具有唯一 VM 标识符和时间戳的文件夹下。 其中每个文件夹对应于应用所在的或正在运行的 VM 实例。

为什么我的应用仍然重启并启用了本地缓存?

本地缓存有助于防止与存储相关的应用重启。 但是,在 VM 上的计划内基础结构升级期间,应用仍可能重启。 总的来说,应观察到启用本地缓存的重启次数更少。

本地缓存是否排除任何目录被复制到更快的本地驱动器?

在复制过程中,将排除命名 repository 的任何文件夹。 在网站内容包括不需要日常操作的源代码管理存储库的情况下,此行为非常有用。

如何在站点管理作后刷新本地缓存日志?

若要刷新本地缓存日志,请停止并重启应用。 此作将清除上一个缓存。

启用本地缓存后,应用服务为何在重启后显示以前部署的文件?

如果以前部署的文件在重启后再次出现,请检查是否存在应用设置 WEBSITE_DISABLE_SCM_SEPARATION=true。 添加此设置会导致通过 Kudu 部署时将内容写入本地虚拟机而不是永久性存储。 为了避免这种情况,请遵循 前面提到的最佳做法 ,并执行到未启用本地缓存的过渡槽的部署。