相关文章推荐
刚毅的芹菜  ·  I'm the Grim Reaper | ...·  1 年前    · 

Azure 应用服务 中,可以直接从部署 ZIP 包文件运行应用。 本文将介绍如何在应用中启用此功能。

应用服务中的所有其他部署方法具有一定的共同之处:文件将部署到应用中的 D:\home\site\wwwroot (或 Linux 应用的 /home/site/wwwroot )。 由于应用在运行时使用同一个目录,因此部署可能会因文件锁定冲突而失败,并且应用可能会由于某些文件尚未更新而出现不可预测的行为。

相反,直接从包运行时,包中的文件不会复制到 wwwroot 目录, 而是将 ZIP 包本身直接装载为只读的 wwwroot 目录。 从包直接运行可提供多种好处:

  • 消除部署与运行时之间的文件锁定冲突。
  • 确保在任意时候只运行完全部署的应用。
  • 可部署到生产应用(需重启)。
  • 改善 Azure 资源管理器部署的性能。
  • 可以减少冷启动时间,特别是对于具有大型 npm 包树的 JavaScript 函数。
  • 目前仅支持 ZIP 包文件。

    创建一个项目 ZIP 包

    如果以 ZIP 包的形式下载文件,请首先提取该文件。 例如,如果从 GitHub 下载了 ZIP 包,则无法按原样部署该文件。 GitHub 可添加额外的嵌套目录,但这不适用于应用服务。

    在本地终端窗口中,导航到应用项目的根目录。

    此目录应包含 Web 应用的入口文件,例如 index.html index.php app.js 。 它还可能包含包管理文件,如 project.json composer.json package.json bower.json requirements.txt

    除非你希望应用服务为你运行部署自动化,否则请运行所有生成任务(例如, npm bower gulp composer pip ),并确保你拥有运行应用所需的所有文件。 如果想要 直接运行包 ,则此步骤是必需的。

    创建一个包含项目所有内容的 zip 文件。 对于 dotnet 项目,此文件夹是 dotnet publish 命令的输出文件夹。 以下命令使用您终端中的默认工具执行操作:

    # Bash
    zip -r <file-name>.zip .
    # PowerShell
    Compress-Archive -Path * -DestinationPath <file-name>.zip
    

    启用从包运行的功能

    WEBSITE_RUN_FROM_PACKAGE 应用设置启用从包运行的功能。 若要指定此设置,请使用 Azure CLI 运行以下命令。

    az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"
    

    WEBSITE_RUN_FROM_PACKAGE="1" 允许从应用本地的包运行应用。 也可以从远程包运行

    在应用服务中运行包的最简单方法是使用 Azure CLI az webapp deployment source config-zip 命令。 例如:

    az webapp deployment source config-zip --resource-group <group-name> --name <app-name> --src <filename>.zip
    

    由于已指定 WEBSITE_RUN_FROM_PACKAGE 应用设置,因此,此命令不会将包内容解压缩到应用的 D:\home\site\wwwroot 目录。 而是将 ZIP 文件按原样上传到 D:\home\data\SitePackages,并在同一目录中创建 packagename.txt,其中包含要在运行时加载的 ZIP 包的名称。 如果以不同的方式(例如使用 FTP)上传 ZIP 包,需要手动创建 D:\home\data\SitePackages 目录和 packagename.txt 文件。

    该命令还会重启应用。 由于设置了 WEBSITE_RUN_FROM_PACKAGE,应用服务会将上传的包装载为只读的 wwwroot 目录,并直接从该装载目录运行应用。

    改为从外部 URL 运行

    还可以从外部 URL(例如 Azure Blob 存储)运行包。 可以使用 Azure 存储资源管理器将包文件上传到 Blob 存储帐户。 应使用带共享访问签名 (SAS) 的专用存储容器或使用托管标识,使应用服务运行时能够安全访问包。

    将文件上传到 Blob 存储并获取该文件的 SAS URL 后,请将 WEBSITE_RUN_FROM_PACKAGE 应用设置指定为该 URL。 以下示例使用 Azure CLI 执行此操作:

    az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_RUN_FROM_PACKAGE="https://myblobstorage.blob.core.windows.net/content/SampleCoreMVCApp.zip?st=2018-02-13T09%3A48%3A00Z&se=2044-06-14T09%3A48%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=bNrVrEFzRHQB17GFJ7boEanetyJ9DGwBSV8OM3Mdh%2FM%3D"
    

    如果将同名的已更新包发布到 Blob 存储,则需要重启应用,以便将更新的包加载到应用服务中。

    使用托管标识访问 Azure Blob 存储中的包

    可以将 Azure Blob 存储配置为使用 Azure AD 授权请求。 这意味着,可以依赖应用程序的托管标识,而不是生成会过期的 SAS 密钥。 默认情况下,将使用应用的系统分配标识。 如果要指定用户分配的标识,可以将 WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID 应用设置设为该标识的资源 ID。 该设置还可以接受“SystemAssigned”作为值,尽管这与完全省略该设置是一样的。

    若要使用标识提取包,请运行以下操作:

  • 确保 Blob 已配置为私有访问

  • 向标识授予存储 Blob 数据读取器角色,其范围为包 blob。 有关创建角色分配的详细信息,请参阅分配 Azure 角色以访问 Blob 数据

  • WEBSITE_RUN_FROM_PACKAGE 应用程序设置设为包的 blob URL。 格式可能为“https://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}”或类似格式。

    从包中运行时部署 WebJob 文件

    当你启用从包中运行应用时,有两种方法可用来部署 WebJob 文件:

  • 在你的应用所在的 ZIP 包中部署:就像平时那样将它们包括在 <project-root>\app_data\jobs\... 中(这将映射到 WebJobs 快速入门中指定的部署路径 \site\wwwroot\app_data\jobs\...)。
  • 从你的应用的 ZIP 包中单独部署:由于平常的部署路径 \site\wwwroot\app_data\jobs\... 现在是只读的,因此你无法在此处部署 WebJob 文件。 请将 WebJob 文件部署到非只读的 \site\jobs\...。 部署到 \site\wwwroot\app_data\jobs\...\site\jobs\... 的 WebJobs 都会运行。
  • \site\wwwroot 成为只读的后,诸如创建 disable.job 之类的操作将会失败。

  • 直接从包运行会使 wwwroot 变为只读目录。 如果应用尝试将文件写入此目录,将会收到错误。
  • 不支持 TAR 和 GZIP 格式。
  • ZIP 文件最大可以为 1GB
  • 此功能与本地缓存不兼容。
  • 若要提高冷启动性能,请使用本地 Zip 选项 (WEBSITE_RUN_FROM_PACKAGE=1)。
  • Azure 应用服务的持续部署
  • 使用 ZIP 或 WAR 文件部署代码
  •  
    推荐文章