设置 Azure 应用服务中的过渡环境

将 Web 应用、移动后端和 API 应用部署到应用服务时,如果应用在“标准”或“高级”应用服务计划模式下运行,则可以部署到单独的部署槽而不是默认的生产槽。 部署槽实际上是具有自身主机名的实时应用。 两个部署槽(包括生产槽)之间的应用内容与配置元素可以交换。 将应用程序部署到部署槽具有以下优点:

  • 可以在分阶段部署槽中验证应用更改,并将其与生产槽交换。
  • 首先将应用部署到槽,然后将其交换到生产,这确保槽的所有实例都已准备好,并交换到生产。 部署应用时,这样可避免停机。 流量重定向是无缝的,且不会因交换操作而删除任何请求。 当不需要预交换验证时,可以通过配置自动交换来自动化这整个工作流。
  • 交换后,具有以前分阶段应用的槽现在具有以前的生产应用。 如果交换到生产槽的更改与预期不同,可以立即执行同一交换来收回“上一已知的良好站点”。

每种应用服务计划模式支持不同数量的部署槽。 若要了解应用模式支持的槽数,请参阅应用服务定价

  • 如果应用具有多个槽,则无法更改模式。
  • 缩放不适用于非生产槽。
  • 非生产槽不支持链接的资源管理。 仅在 Azure 门户中,可以通过暂时将非生产槽移到其他应用服务计划模式,避免对生产槽造成这种潜在影响。 请注意,非生产槽必须先再次与生产槽共享相同的模式,才能交换这两个槽。

添加部署槽

必须在“标准”或“高级”模式下运行应用,才能启用多个部署槽。

  1. Azure 门户中,打开应用的资源边栏选项卡
  2. 选择“部署槽”选项,并单击“添加槽”。

    添加新部署槽

    Note

    如果应用尚未处于“标准”或“高级”模式,则会收到消息,指示启用过渡支持的模式。 此时,可选择“升级”,并导航到应用的“缩放”选项卡,并继续。

  3. 在“添加槽”边栏选项卡中,为槽提供一个名称,并选择是否要从其他现有部署槽中克隆应用配置。 单击复选标记以继续。

    配置源

    第一次添加槽时,只有两种选择:从生产中的默认槽克隆配置或者完全不进行克隆。 创建多个插槽后,可以从生产槽以外的槽克隆配置:

    配置源

  4. 在应用的资源边栏选项卡中,单击“部署槽”,并单击部署槽打开该槽的资源边栏选项卡,它包含一组度量值和配置(类似任何其他应用)。 槽的名称出现在边栏选项卡顶部,提醒你正在查看部署槽。

    部署槽标题

  5. 单击此槽边栏选项卡中的应用 URL。 请注意,部署槽有其自己的主机名,同时它也是动态应用。 若要限制对部署槽的公共访问权限,请参阅 应用服务 Web 应用 – 阻止对非生产部署槽的 Web 访问

创建部署槽后没有任何内容。 可以从其他存储库分支或完全不同的存储库部署到槽。 还可以更改此槽的配置。 使用与内容更新部署槽关联的发布配置文件或部署凭证。 例如,可以使用 git 发布到此槽

部署槽的配置

从另一个部署槽克隆配置时,可以编辑克隆的配置。 此外,某些配置元素在交换时遵循内容(不特定于位置),而其他配置元素会在交换之后保留在同一个位置(特定于位置)。 以下列表显示交换槽时要更改的配置。

已交换的设置

  • 常规设置 - 例如 Framework 版本、32/64 位、Web 套接字
  • 应用设置(可以配置为停在槽中)
  • 连接字符串(可以配置为停在槽中)
  • 处理程序映射
  • 监视和诊断设置
  • WebJobs 内容

不交换的设置

  • 发布终结点
  • 自定义域名
  • SSL 证书和绑定
  • 缩放设置
  • Web 作业计划程序

要将应用设置或连接字符串配置为停在某个槽中(不交换),请访问特定槽的“应用程序设置”边栏选项卡,然后针对应该位于该槽中的配置元素选中“槽设置”框。 请注意,如果将配置元素标记为特定于槽会在将该元素建立为无法在所有与该应用关联的部署槽之间进行交换时产生影响。

槽设置

交换部署槽

在应用的资源边栏选项卡的“概述”或“部署槽”中,可交换部署槽。

Important

将应用从部署槽交换到生产之前,请确保所有非槽特定的设置已完全根据希望它在交换目标中的位置明确地进行配置。

  1. 若要交换部署槽,请在应用命令栏或部署槽命令栏中,单击“交换” 按钮。

    “交换”按钮

  2. 确保正确设置交换源和交换目标。 交换目标通常是生产槽。 单击“确定”完成操作。 操作完成后,即已交换部署槽。

    完成交换

    有关“带预览的交换”交换类型,请参阅带预览的交换(多阶段交换)

带预览的交换(多阶段交换)

带预览的交换(或多阶段交换)可简化特定于槽的配置元素(如连接字符串)的验证。 对于任务关键型工作负荷,在应用生产槽的配置时,请验证应用的行为是否符合预期,并且必须在将应用交换到生产之前执行此验证。 带预览的交换正是需要的。

如果使用“带预览的交换”选项(请参阅交换部署槽),应用服务将执行以下操作:

  • 目标槽保持不变,该槽上的现有工作负荷(如生产)不会受影响。
  • 将目标槽的配置元素应用到源槽,包括特定于槽的连接字符串和应用设置。
  • 使用前面提到的这些配置元素,重启源槽上的工作进程。
  • 完成交换后:将准备好的源槽移到目标槽。 目标槽会按手动交换的方式移动到源槽。
  • 取消交换时:重新将源槽的配置元素应用到源槽。

可预览应用具体如何使用目标槽配置。 完成验证后,可通过单独的步骤完成交换。 此步骤具有额外优势,源槽已通过所需的配置提前准备好,因此客户端不会遇到停机的情况。

“适用于部署槽的 Azure PowerShell cmdlet”部分中提供了可用于多阶段交换的 Azure PowerShell cmdlet 示例。

配置自动交换

自动交换简化了 DevOps 方案,在此方案中,可连续部署应用,无需冷启动且不会给应用的最终客户造成停机。 将部署槽配置为自动交换到生产槽后,每次将代码更新推送到该槽时,应用服务会在其已在该槽上做好准备之后,自动将该应用交换到生产槽。

Important

为某个槽启用自动交换时,请确保槽配置与针对目标槽(通常是生产槽)的配置完全相同。

为槽配置自动交换很容易。 请遵循以下步骤进行配置:

  1. 在“部署槽”中,选择非生产槽,并在该槽的资源边栏选项卡中选择“应用程序设置”。

  2. 针对“自动交换”选择“打开”,在“自动交换槽”中选择所需的目标槽,并在命令栏中单击“保存”。 确保槽的配置与针对目标槽的配置完全相同。

    操作完成后,“通知”选项卡将闪烁绿色的“成功”字样。

    Note

    若要测试应用的自动交换,可在“自动交换槽”中选择非生产目标槽,以便先熟悉这个功能。

  3. 向该部署槽执行代码推送。 不久之后,自动交换就会发生,而更新将反映在目标槽的 URL 上。

在交换后回退生产应用的步骤

如果在槽交换后在生产中发现任何错误,请立即通过交换相同的两个槽来将槽回滚到交换前状态。

交换前的自定义准备工作

某些应用可能需要自定义的准备操作。 web.config 中的 applicationInitialization 配置元素允许指定收到请求之前要执行的自定义初始化操作。 交换操作将等待此自定义准备操作完成。 以下是 web.config 片段的示例。

<applicationInitialization>
    <add initializationPage="/" hostName="[app hostname]" />
    <add initializationPage="/Home/About" hostname="[app hostname]" />
</applicationInitialization>

删除部署槽

在部署槽的边栏选项卡中,打开部署槽的边栏选项卡,单击“概述”(默认页),并在命令栏中单击“删除”。

删除部署槽

适用于部署槽的 Azure PowerShell cmdlet

Azure PowerShell 是一个模块,可提供通过 Windows PowerShell 管理 Azure 的 cmdlet,包括对管理 Azure 应用服务的部署槽的支持。

Note

若要使用中国云环境,以下 Azure PowerShell 命令需要添加“-Environment”参数。
Add-AzureRmAccount
Login-AzureRmAccount

例如,Login-AzureRmAccount 应变为 $china = Get-AzureRmEnvironment -Name AzureChinaCloud; Login-AzureRmAccount -Environment $china(如果使用 Azure PowerShell 1.0.0 或 1.0.1)或 Login-AzureRmAccount -EnvironmentName AzureChinaCloud(如果使用 Azure PowerShell 1.0.2 或更高版本)。

创建 Web 应用

New-AzureRmWebApp -ResourceGroupName [resource group name] -Name [app name] -Location [location] -AppServicePlan [app service plan name]

创建部署槽

New-AzureRmWebAppSlot -ResourceGroupName [resource group name] -Name [app name] -Slot [deployment slot name] -AppServicePlan [app service plan name]

启动带预览的交换(多阶段交换)并将目标槽配置应用到源槽

$ParametersObject = @{targetSlot  = "[slot name - e.g. "production"]"}
Invoke-AzureRmResourceAction -ResourceGroupName [resource group name] -ResourceType Microsoft.Web/sites/slots -ResourceName [app name]/[slot name] -Action applySlotConfig -Parameters $ParametersObject -ApiVersion 2015-07-01

取消挂起的交换(带预览的交换)并还原源槽配置

Invoke-AzureRmResourceAction -ResourceGroupName [resource group name] -ResourceType Microsoft.Web/sites/slots -ResourceName [app name]/[slot name] -Action resetSlotConfig -ApiVersion 2015-07-01

交换部署槽

$ParametersObject = @{targetSlot  = "[slot name - e.g. "production"]"}
Invoke-AzureRmResourceAction -ResourceGroupName [resource group name] -ResourceType Microsoft.Web/sites/slots -ResourceName [app name]/[slot name] -Action slotsswap -Parameters $ParametersObject -ApiVersion 2015-07-01

删除部署槽

Remove-AzureRmResource -ResourceGroupName [resource group name] -ResourceType Microsoft.Web/sites/slots -Name [app name]/[slot name] -ApiVersion 2015-07-01

用于部署槽的 Azure 命令行接口 (Azure CLI) 命令

Azure CLI 提供了适用于 Azure 的跨平台命令,包括对管理应用服务部署槽的支持。

Note

若要在中国云环境中使用 Azure CLI,登录时需要添加 -e AzureChinaCloud 参数。

例如 azure login -u <your organizational ID email address> -e AzureChinaCloud

  • 有关安装和配置 Azure CLI 的说明(包括有关如何将 Azure CLI 连接到 Azure 订阅的信息),请参阅安装和配置 Azure CLI
  • 若要在 Azure CLI 中列出可用于 Azure 应用服务的命令,请调用 azure site -h

Note

在 Azure 中国区使用 Azure CLI 2.0 之前,请先运行 az cloud set -n AzureChinaCloud 来改变云环境。如果想切回国际版 Azure,请再次运行 az cloud set -n AzureCloud

Note

若要了解部署槽的 Azure CLI 2.0 命令,请参阅 az appservice web 部署槽

azure site list

若要了解当前订阅中的应用,请调用 azure site list,如以下示例所示。

azure site list webappslotstest

azure site create

若要创建部署槽,请调用 azure site create ,并指定现有应用的名称和要创建的槽的名称,如以下示例所示。

azure site create webappslotstest --slot staging

若要启用新槽源代码管理,请使用 --git 选项,如以下示例所示。

azure site create --git webappslotstest --slot staging

azure site swap

若要使更新的部署槽成为生产应用,请使用 azure site swap 命令执行交换操作,如以下示例所示。 生产应用将不会停机,也不会进行冷启动。

azure site swap webappslotstest

azure site delete

要删除不再需要的部署槽,请使用 azure site delete 命令,如以下示例所示。

azure site delete webappslotstest --slot staging

后续步骤

Azure 应用服务 Web 应用 - 阻止对非生产部署槽的 Web 访问 Azure 试用版