本文介绍如何将代码作为 ZIP、WAR、JAR 或 EAR 包部署到 Azure 应用服务 。 此外,还介绍如何将各个文件独立于应用程序包部署到应用服务。

若要完成本文中的步骤,请 创建一个应用服务应用 ,或者使用为其他教程创建的应用。

如果没有 Azure 订阅 ,请在开始之前创建一个 Azure 免费帐户

创建一个项目 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

部署 ZIP 包

部署 ZIP 包时,应用服务会将其内容解压缩到应用的默认路径(在 Windows 中为 D:\home\site\wwwroot,在 Linux 中为 /home/site/wwwroot)。

此 ZIP 包部署使用为基于持续集成的部署提供支持的同一 Kudu 服务。 Kudu 支持使用以下功能进行 ZIP 包部署:

  • 删除先前的部署留下的文件。
  • 启用默认生成过程的选项,包括包还原。
  • 部署自定义,包括运行部署脚本。
  • 部署日志。
  • 包大小上限为 2048 MB。
  • 有关详细信息,请参阅 Kudu 文档

    仅当 ZIP 包中文件的时间戳与已部署的文件不匹配时,才会复制该包中的文件。 使用缓存输出的生成过程生成 zip 可以使部署速度更快。 有关详细信息,请参阅从 zip 文件或 url 部署

    使用 az webapp deploy 命令将 ZIP 包部署到 Web 应用。 该 CLI 命令使用 Kudu 发布 API 部署文件,并且完全可自定义。

    以下示例将 ZIP 包推送到站点。 为 --src-path 指定本地 ZIP 包的路径。

    az webapp deploy --resource-group <group-name> --name <app-name> --src-path <zip-package-path>
    

    部署 ZIP 包后,此命令将重启应用。

    根据你的 web 应用的网络配置,从本地环境对站点的直接访问可能会被阻止。 要在这种情况下部署代码,可以将 ZIP 发布到可从 web 应用访问的存储系统,并触发应用以从存储位置拉取 ZIP,而不是将 ZIP 推送到 web 应用 。 有关部署到网络安全的 web 应用的详细信息,请参阅此文

    以下示例使用 --src-url 参数指定站点应从中拉取 ZIP 的 Azure 存储帐户的 URL。

    az webapp deploy --resource-group <group-name> --name <app-name> --src-url "https://storagesample.blob.core.windows.net/sample-container/myapp.zip?sv=2021-10-01&sb&sig=slk22f3UrS823n4kSh8Skjpa7Naj4CG3
    

    以下示例使用 cURL 工具部署 ZIP 包。 替换占位符 <username><zip-package-path><app-name>。 出现 cURL 的提示时,请键入部署密码

    curl -X POST -u <username:password> -T "@<zip-package-path>" https://<app-name>.scm.azurewebsites.net/api/publish?type=zip
    

    根据你的 web 应用的网络配置,从本地环境对站点的直接访问可能会被阻止。 要在这种情况下部署代码,可以将 ZIP 发布到可从 web 应用访问的存储系统,并触发应用以从存储位置拉取 ZIP,而不是将 ZIP 推送到 web 应用 。 有关部署到网络安全的 web 应用的详细信息,请参阅此文

    以下示例使用 packageUri 参数指定 Web 应用应从中拉取 ZIP 的 Azure 存储帐户的 URL。

    curl -X POST -u <username:password> https://<app-name>.scm.azurewebsites.net/api/publish -d '{"packageUri": "https://storagesample.blob.core.windows.net/sample-container/myapp.zip?sv=2021-10-01&sb&sig=slk22f3UrS823n4kSh8Skjpa7Naj4CG3"}'
    

    在浏览器中,导航到 https://<app_name>.scm.azurewebsites.net/ZipDeployUI

    通过将文件拖动到网页中的文件资源管理器区域,上传你在创建项目 ZIP 包中创建的 ZIP 包。

    部署正在进行的时候,右上角的图标会以百分比形式显示进度。 该页还在资源管理器区域下方显示操作的详细消息。 完成后,最后一个部署消息会显示:Deployment successful

    上面的终结点目前不适用于 Linux 应用服务。 请考虑改用 FTP 或 ZIP 部署 API

    为 ZIP 部署启用生成自动化

    默认情况下,部署引擎假设 ZIP 包已准备好按原样运行,并且不运行任何生成自动化。 若要启用与 Git 部署中相同的生成自动化,请通过在 Cloud Shell 中运行以下命令来设置 SCM_DO_BUILD_DURING_DEPLOYMENT 应用设置:

    az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    

    有关详细信息,请参阅 Kudu 文档

    部署期间我的应用会发生什么情况?

    所有官方支持的部署方法均会更改应用的 /home/site/wwwroot 文件夹中的文件。 这些文件用于运行你的应用。 因此,部署可能会因为锁定的文件而失败。 应用可能会在部署期间发生不可预测的行为,因为这些文件并非同时更新。 这种行为对于面向客户的应用来说是需要避免的。 可以通过几种方法避免这些问题:

  • 直接从 ZIP 包运行应用,而无需将其解压。
  • 部署期间停止应用或为其启用脱机模式。 有关详细信息,请参阅处理部署过程中锁定的文件
  • 部署到过渡槽且开启了自动交换
  • 部署 WAR/JAR/EAR 包

    可将 WARJAREAR 包部署到应用服务,以使用 Azure CLI、PowerShell 或 Kudu 发布 API 运行 Java Web 应用。

    部署过程会正确地将包放置在共享文件驱动器上(请参阅 Kudu 发布 API 参考)。 因此,不建议使用 FTP 或 WebDeploy 部署 WAR/JAR/EAR 包。

    Azure CLI Azure PowerShell Kudu API Kudu UI

    使用 az webapp deploy 命令将 WAR 包部署到 Tomcat 或 JBoss EAP。 为 --src-path 指定本地 Java 包的路径。

    az webapp deploy --resource-group <group-name> --name <app-name> --src-path ./<package-name>.war
    

    根据你的 web 应用的网络配置,从本地环境对站点的直接访问可能会被阻止。 要在这种情况下部署代码,可以将 ZIP 发布到可从 web 应用访问的存储系统,并触发应用以从存储位置拉取 ZIP,而不是将 ZIP 推送到 web 应用 。 有关部署到网络安全的 web 应用的详细信息,请参阅此文

    以下示例使用 --src-url 参数指定 Web 应用应从中拉取 WAR 的 Azure 存储帐户的 URL。

    az webapp deploy --resource-group <group-name> --name <app-name> --src-url "https://storagesample.blob.core.windows.net/sample-container/myapp.war?sv=2021-10-01&sb&sig=slk22f3UrS823n4kSh8Skjpa7Naj4CG3 --type war
    

    该 CLI 命令使用 Kudu 发布 API 来部署包,并且完全可自定义。

    以下示例使用 Publish-AzWebapp 上传 .war 文件。 请替换占位符 <group-name><app-name><package-path>(Azure PowerShell 仅支持 WAR 和 JAR 文件)。

    Publish-AzWebapp -ResourceGroupName <group-name> -Name <app-name> -ArchivePath <package-path>
    

    以下示例使用 cURL 工具部署 .war、.jar 或 .ear 文件。 请替换占位符 <username><file-path><app-name><package-type>(相应地替换为 warjarear)。 出现 cURL 的提示时,请键入部署密码

    curl -X POST -u <username> -T @"<file-path>" https://<app-name>.scm.azurewebsites.net/api/publish?type=<package-type>
    

    根据你的 web 应用的网络配置,从本地环境对站点的直接访问可能会被阻止。 要在这种情况下部署代码,可以将 ZIP 发布到可从 web 应用访问的存储系统,并触发应用以从存储位置拉取 ZIP,而不是将 ZIP 推送到 web 应用 。 有关部署到网络安全的 web 应用的详细信息,请参阅此文

    以下示例使用 packageUri 参数指定 Web 应用应从中拉取 WAR 的 Azure 存储帐户的 URL。 除 WAR 外,该文件也可以是 JAR 或 EAR 文件。

    curl -X POST -u <username> https://<app-name>.scm.azurewebsites.net/api/publish -d '{"packageUri": "https://storagesample.blob.core.windows.net/sample-container/myapp.war?sv=2021-10-01&sb&sig=slk22f3UrS823n4kSh8Skjpa7Naj4CG3"}'
    

    有关详细信息,请参阅 Kudu 发布 API 参考

    Kudu UI 不支持部署 JAR、WAR 或 EAR 应用程序。 请使用其他某个选项。

    部署单个文件

    Azure CLI Azure PowerShell Kudu API Kudu UI

    az webapp deploy 命令与 --type 参数配合使用,将启动脚本、库和静态文件部署到 Web 应用。

    如果以这种方式部署启动脚本,应用服务会自动使用你的脚本来启动应用。

    该 CLI 命令使用 Kudu 发布 API 部署文件,并且完全可自定义。

    部署启动脚本

    az webapp deploy --resource-group <group-name> --name <app-name> --src-path scripts/startup.sh --type=startup
    

    部署库文件

    az webapp deploy --resource-group <group-name> --name <app-name> --src-path driver.jar --type=lib
    

    部署静态文件

    az webapp deploy --resource-group <group-name> --name <app-name> --src-path config.json --type=static
    

    部署启动脚本

    以下示例使用 cURL 工具为应用程序部署启动文件。请替换占位符 <username><startup-file-path><app-name>。 出现 cURL 的提示时,请键入部署密码

    curl -X POST -u <username> -T @"<startup-file-path>" https://<app-name>.scm.azurewebsites.net/api/publish?type=startup
    

    部署库文件

    以下示例使用 cURL 工具为应用程序部署库文件。 替换占位符 <username><lib-file-path><app-name>。 出现 cURL 的提示时,请键入部署密码

    curl -X POST -u <username> -T @"<lib-file-path>" "https://<app-name>.scm.azurewebsites.net/api/publish?type=lib&path=/home/site/deployments/tools/my-lib.jar"
    

    部署静态文件

    以下示例使用 cURL 工具为应用程序部署配置文件。 替换占位符 <username><config-file-path><app-name>。 出现 cURL 的提示时,请键入部署密码

    curl -X POST -u <username> -T @"<config-file-path>" "https://<app-name>.scm.azurewebsites.net/api/publish?type=static&path=/home/site/deployments/tools/my-config.json"
    

    Kudu 发布 API 参考

    publish Kudu API 允许指定 CLI 命令中所用的相同参数作为 URL 查询参数。 若要使用 Kudu API 进行身份验证,可以将应用的部署凭据与基本身份验证配合使用。

    下表显示了可用的查询参数及其允许的值和说明。

    war|jar|ear|lib|startup|static|zip 所部署的项目的类型,此参数设置默认目标路径,并告知 Web 应用应如何处理部署。
    - type=zip:通过将内容解压缩到 /home/site/wwwroot 来部署 ZIP 包。 path 参数是可选的。
    - type=war:部署 WAR 包。 默认情况下,WAR 包将部署到 /home/site/wwwroot/app.war。 可以使用 path 指定目标路径。
    - type=jar:将 JAR 包部署到 /home/site/wwwroot/app.jar。 将忽略 path 参数
    - type=ear:将 EAR 包部署到 /home/site/wwwroot/app.ear。 将忽略 path 参数
    - type=lib:部署 JAR 库文件。 默认情况下,该文件将部署到 /home/site/libs。 可以使用 path 指定目标路径。
    - type=static:部署静态文件(例如脚本)。 默认情况下,该文件将部署到 /home/site/wwwroot
    - type=startup:部署由应用服务自动用作应用启动脚本的脚本。 默认情况下,该脚本将部署到 D:\home\site\scripts\<name-of-source>(在 Windows 中)或 home/site/wwwroot/startup.sh(在 Linux 中)。 可以使用 path 指定目标路径。 restart true|false 默认情况下,在完成部署操作后,API 将重启应用 (restart=true)。 若要部署多个项目,请设置 restart=false,防止在除最后一个部署外的其他所有部署上重启。 clean true|false 指定在目标部署中部署项目之前是否清理(删除)目标部署。 ignorestack true|false 发布 API 使用 WEBSITE_STACK 环境变量根据站点的语言堆栈选择安全默认值。 将此参数设置为 false 会禁用任何特定于语言的默认值。 "<absolute-path>" 要将项目部署到的绝对路径。 例如:"/home/site/deployments/tools/driver.jar""/home/site/scripts/helper.sh"。 String

    有关更高级的部署方案,请参阅使用 Git 部署到 Azure。 通过基于 Git 的 Azure 部署可实现版本控制、包还原、MSBuild 等功能。

  • Kudu:从 zip 文件部署
  • 环境变量和应用设置参考
  •