你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
直接从 ZIP 包运行 Azure 应用服务中的应用
注意
Python 应用不支持从包运行。 部署 Python 代码的 ZIP 文件时,需要设置一个标志以启用 Azure生成自动化。 生成自动化将为应用创建 Python 虚拟环境,并安装所需的任何必要要求和包。 有关更多详细信息,请参阅生成自动化。
在 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
命令的输出目录中的所有内容(不包含输出目录本身)。 例如,在终端中使用以下命令创建包含当前目录内容的 ZIP 包:
# 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 deploy --resource-group <group-name> --name <app-name> --src-path <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) 的专用存储容器或使用托管标识,使应用服务运行时能够安全访问包。
注意
目前,运行本地包的现有应用服务资源无法迁移到从远程包运行。 必须创建一个新的应用服务资源,并配置为从外部 URL 运行。
将文件上传到 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 存储配置为使用 Microsoft Entra ID 授权请求。 此配置意味着可以依赖应用程序的托管标识,而不是生成会过期的 SAS 密钥。 默认情况下,将使用应用的系统分配的标识。 如果要指定用户分配的标识,可以将 WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID
应用设置设为该标识的资源 ID。 该设置还可以接受 SystemAssigned
作为值,该值等效于将该设置省略。
若要使用标识提取包,请运行以下操作:
确保 Blob 已配置为私有访问。
向标识授予存储 Blob 数据读取器角色,其范围为包 blob。 有关创建角色分配的详细信息,请参阅分配 Azure 角色以访问 Blob 数据。
将
WEBSITE_RUN_FROM_PACKAGE
应用程序设置设为包的 blob URL。 此 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)。