Azure 应用服务本地缓存概述

注意

在函数应用或容器化应用服务应用中(例如在 Windows 容器中或 Linux 上的应用服务中),不支持本地缓存。 适用于这些应用类型的本地缓存版本是应用缓存

Azure 应用服务内容将存储在 Azure 存储中,作为内容共享持续呈现。 此设计旨在兼容各种应用,具有以下特点:

  • 内容跨应用的多个虚拟机 (VM) 实例共享。
  • 内容是持久性的,运行应用即可对其进行修改。
  • 在同一共享内容文件夹下提供日志文件和诊断数据文件。
  • 发布新内容会直接更新内容文件夹。 可以通过 SCM 网站和运行的应用即时查看相同的内容(通常情况下,在文件发生更改时,可以通过 ASP.NET 之类的特定技术重启应用,以获取最新内容)。

虽然许多应用使用所有此类功能或其中一项功能,但某些应用只需要高性能的只读内容存储,此类存储可用性高且支持这些应用的运行。 这些应用可以充分利用特定本地缓存的 VM 实例。

Azure 应用服务本地缓存功能允许通过 Web 角色来查看内容。 存储内容是在站点启动后异步创建的,而该内容是对存储内容进行写后即丢弃式缓存的结果。 当缓存就绪时,对站点进行切换,使之在已缓存内容的基础上运行。 在本地缓存上运行的应用具有以下优势:

  • 不受访问 Azure 存储上的内容时出现的延迟的影响。
  • 它们不受存储连接问题的影响,因为只读副本缓存在辅助角色上。
  • 因存储共享更改而需要重新启动应用的次数较少。

注意

如果使用 Java(Java SE、Tomcat 或 JBoss EAP),则默认情况下 Java 项目(.jar、.war,和 .ear 文件)将被本地复制到辅助角色。 如果 Java 应用程序也依赖于对其他文件的只读访问,则将 JAVA_COPY_ALL 设置为 true,以便同时复制这些文件。 如果启用“本地缓存”,它将优先于此特定于 Java 的增强功能。

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

  • D:\home 指向本地缓存,它是应用启动时在 VM 实例上创建的。 D:\local 继续指向特定于临时 VM 的存储。
  • 本地缓存包含共享内容存储的 /site 和 /siteextensions 文件夹的一次性副本,分别位于 D:\home\site 和 D:\home\siteextensions。 应用启动时,文件会复制到本地缓存。 默认情况下,每个应用的这两个文件夹的大小限制为 1 GB,但可增至 2 GB。 请注意,随着缓存大小的增加,加载缓存需要的时间也越长。 如果已将本地缓存限制增加到 2 GB,并且复制的文件超过了最大大小 2 GB,则应用服务会在不提示的情况下忽略本地缓存,从远程文件共享读取数据。

重要

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

  • 本地缓存是可以读写的。 不过,如果应用移动了虚拟机,或者系统重启了应用,则会放弃所做的任何修改。 如果应用在内容存储中存储了任务关键型数据,请不要使用本地缓存。
  • D:\home\LogFiles 和 D:\home\Data 包含日志文件和应用数据。 两个子文件夹本地存储在 VM 实例上,并定期复制到共享内容存储。 应用可以通过将日志文件和数据写入到这些文件夹来保留它们。 但是,复制到共享内容存储是最大努力,因此由于 VM 实例的突然崩溃,日志文件和数据可能会丢失。
  • 日志流式处理受最大努力副本的影响。 可以在流式传输的日志中观察到最多一分钟的延迟。
  • 在共享内容存储中,对于使用本地缓存的应用, LogFilesData 文件夹的文件夹结构会发生变化。 它们之中现在出现了子文件夹,其遵循的命名模式为“唯一标识符”+ 时间戳。 每个子文件夹对应于应用正在其中运行或已运行的一个虚拟机实例。
  • D:\home 中的其他文件夹保留在本地缓存中,不会复制到共享内容存储。
  • 通过任何支持的方法进行的应用部署都将直接发布到持久共享内容存储。 若要刷新本地缓存中的 D:\home\site 和 D:\home\siteextensions 文件夹,需要重新启动应用。 若要确保无缝的生命周期,请参阅本文后面提供的信息。
  • SCM 站点的默认内容视图仍是共享内容存储的视图。

在应用服务中启用本地缓存

注意

F1 或 D1 层不支持本地缓存 。

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

通过 Azure 门户配置本地缓存

使用以下应用设置即可在每个 Web 应用的基础上启用本地缓存: WEBSITE_LOCAL_CACHE_OPTION = Always

Azure portal app settings: Local Cache

使用 Azure Resource Manager 配置本地缓存

...

{
    "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 (2000 MB)。 请注意,当此大小增加时,加载本地缓存需要的时间会变长。

使用应用服务本地缓存的最佳实践

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

  • 将值为 Always粘性应用设置 WEBSITE_LOCAL_CACHE_OPTION 添加到生产槽。 如果使用的是 WEBSITE_LOCAL_CACHE_SIZEINMB,也可将其作为粘性设置添加到“生产”槽。
  • 创建过渡槽,并发布到过渡槽。 如果获得了生产槽的本地缓存优势,则要想通过无缝的“构建-部署-测试”生命周期进行过渡,通常不需要将过渡槽设置为使用本地缓存。
  • 针对“过渡”槽来测试站点。
  • 准备就绪以后,在过渡槽和生产槽之间执行交换操作
  • 粘性设置包含名称,会粘到某个槽上。 因此,将“过渡”槽交换成“生产”槽以后,该槽会继承本地缓存应用设置。 新交换的“生产”槽会在几分钟后以本地缓存为基础运行,并会在交换后进行槽预热的过程中预热。 因此,在槽交换完成后,“生产”槽会在本地缓存的基础上运行。

常见问题 (FAQ)

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

当复制的文件超出本地缓存大小限制时,应用将从远程共享读取。 但是,部署和交换操作可能会失败并出现错误。 有关大小限制和结果,请参阅下表。

 本地缓存大小 复制的文件 结果
≤ 2 GB ≤本地缓存大小 从本地缓存读取。
≤ 2 GB > 本地缓存大小 从远程共享读取。
注意:部署和交换操作可能会失败并出现错误。

如何确定本地缓存是否适用于应用?

如果应用需要高性能且可靠的内容存储,在运行时不使用内容存储来写入关键数据,并且总大小不到 2 GB,则可确定本地缓存适用于应用。 可通过站点扩展“Azure Web 应用磁盘使用情况”获取 /site 和 /siteextensions 文件夹的总大小。

如何确定站点是否已切换为使用本地缓存?

如果在过渡环境中使用本地缓存功能,则在本地缓存预热之前,交换操作不会完成。 若要了解站点是否正在本地缓存的基础上运行,可查看工作进程环境变量 WEBSITE_LOCALCACHE_READY。 根据工作进程环境变量页上的说明,访问多个实例上的工作进程环境变量。

刚发布的新更改内容似乎并没有在应用上显示出来, 为什么?

如果应用使用本地缓存,则需重新启动站点才能获取最新更改。 不想将更改发布到生产站点? 请参阅前述最佳实践部分的槽选项。

注意

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

日志在哪里?

使用本地缓存时,日志和数据文件夹看起来稍有不同。 但是,子文件夹的结构始终是相同的,区别在于子文件夹嵌套在格式为“唯一 VM 标识符”+ 时间戳的子文件夹下。

本地缓存已启用,但应用仍重新启动。 为什么会这样? 本以为本地缓存可以缓解应用频繁重启的情况。

本地缓存确实可以防止与存储相关的应用重启情况。 但是,在对 VM 进行计划内基础结构升级时,应用仍可能重新启动。 启用本地缓存以后,总体说来应用重启的次数应该会少一些。

本地缓存是否会阻止某些目录被复制到更快的本地驱动器?

在复制存储内容过程中,将排除任何名为存储库的文件夹。 如果站点内容包含应用日常操作中可能不必要的源控件存储库,则此方法非常有用。

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

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

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

如果应用服务在重新启动时开始显示以前部署的文件,请检查是否存在应用设置 -“WEBSITE_DISABLE_SCM_SEPARATION=true”。 添加此设置后,通过 KUDU 的任何部署都将开始写入到本地 VM,而不是持久存储。 应利用本文前面提到的最佳做法,其中应始终对未启用本地缓存的过渡槽进行部署。

更多资源

环境变量和应用设置参考