Web 部署自动备份

作者:Elliott Hamai

介绍

在 V3 中,Web 部署为 IIS 7 及更高版本引入了自动服务器端备份功能。 在服务器上配置自动备份并且用户使用 Web 部署发布到其站点时,它将首先对实时站点进行备份并将其存储在服务器上,然后再将任何更改提交到站点。 如果发布由于某种原因而失败,或者用户想要还原其网站的早期版本,他将能够从这些备份中还原,而无需服务器管理员参与。 此功能需要先由服务器管理员启用和配置,然后才能由最终用户利用。

创建备份时

当 Web 部署检测到用户正在使用 contentPath、iisApp 或 appHostConfig 提供程序进行发布时,它将自动启动备份(如果已在服务器上启用)。 在许多情况下,这些提供程序也包含在使用 Web Matrix 和 Visual Studio 的发布中。 下面是同步的命令行示例,它将使用 Web 部署代理在“remoteComputerName”上启动备份。

msdeploy.exe -verb:sync -source:iisapp=<siteName> -dest:auto,computername=<remoteComputerName>

如果源提供程序是清单,则 Web 部署将检查清单中的所有提供程序,以确定清单中的任何提供程序是否是 contentPath、iisApp 或 appHostConfig 提供程序。 如果是,则它将为清单中的所有提供程序启动备份(有关例外情况,请参阅有关“已知问题和限制”的部分)。 但是,如果有存在冲突的提供程序路径(例如一个指向站点“foo”,而另一个指向站点“bar”),Web 部署不会进行备份。

备份包含的内容

默认情况下,Web 部署将使用你为发布指定的任何提供程序(从未包括的 setAcl 除外)来创建备份。 因此,如果我使用 iisApp 和 dbFullSql 提供程序进行发布,Web 部署将在服务器上备份 iisApp 和 dbFullSql 提供程序。 这将包括属于 Web 应用程序的所有内容和配置,以及可用于重新发布 Web 应用程序的数据库脚本。 可以通过修改 ExcludedProviders 备份设置,或者通过在发布之前指定跳过规则来更改此默认行为。

这些备份是有效的 Web 部署包,可以针对任何兼容的 IIS 服务器进行复制以及与 Web 部署一起使用。

在服务器上配置自动备份功能(适用于服务器管理员)

为了向用户提供自动备份功能,服务器管理员需要在可以存储这些备份的服务器上预配空间。 此空间可以在物理上位于服务器上,也可以位于可从服务器访问的网络共享上。

所需的空间量将取决于单个应用程序的大小以及计划存储在服务器上的备份数。 如果要控制备份所占用的空间,则应为每个站点创建单独的文件夹,并使用 Windows 文件服务器资源管理器 (FSRM) 来限制单个文件夹的配额。 作为一种安全最佳做法,还应将这些文件夹加入 ACL,以便每个用户只能对自己的文件夹进行读/写访问。

可以在服务器上全局启用备份,以便所有站点都可以利用它,也可以按站点配置备份。

使用 PowerShell 自动在服务器上配置备份设置以供全局使用

可以在 %programfiles%\IIS\Microsoft Web Deploy V3\scripts\BackupScripts.ps1 下找到用于在服务器级别配置备份功能的 PowerShell 脚本。 若要加载它,只需在 PowerShell 中导航到该目录并运行:

. .\BackupScripts.ps1

这会将以下函数加载到可用于配置备份的会话中。

  1. TurnOn-Backups:启用/禁用整个服务器的备份。
  2. Configure-Backups:设置默认服务器或特定于站点的备份设置。
  3. Configure-BackupSettingsProvider:控制服务器设置,以确定站点管理员对其备份行为的控制程度。
  4. Get-BackupSettings:查询服务器或特定于站点的备份设置
  5. Reset-BackupSettings:重置服务器或特定于站点的备份设置

TurnOn-Backups 函数:

允许服务器管理员在服务器范围内启用或禁用备份,而无需覆盖特定于站点的设置。 默认情况下,备份处于禁用状态。 即使在启用备份后,仍必须在服务器或站点级别“启用”备份才能进行备份。

# Turns on all backup functionality
TurnOn-Backups -On $true

# Turns off all backup functionality
TurnOn-Backups -On $false

Configure-Backups:

允许服务器管理员在服务器站点特定的范围内配置默认备份行为。 如果管理员在服务器范围内指定了设置,并且站点已指定特定于站点的设置,则 Web 部署将首选特定于站点的设置而不是服务器设置。 如果服务器管理员希望首选服务器设置,他/她应重置站点备份设置,这将导致站点从服务器自动继承其设置。

# Changes default global backup behavior to enabled
Configure-Backups -Enabled $true

# Changes default backup behavior for site "foo" to enabled
Configure-Backups -SiteName "foo" -Enabled $true

# Changes the path of where backups are stored to a sibling directory named "siteName_snapshots".  
# For more information about path variables, see the "backupPath" attribute in the section 
# "Configuring  Backup Settings on the Server for Global usage manually in IIS Config"
Configure-Backups -BackupPath "{SitePathParent}\{siteName}_snapshots"

# Configures default backup limit to 5 backups
Configure-Backups -NumberOfBackups 5

# Configures sync behavior to fail if a sync fails for any reason
Configure-Backups -ContinueSyncOnBackupFailure $false

# Adds providers to skip when performing a backup
Configure-Backups -AddExcludedProviders @("dbmysql","dbfullsql")

Configure-BackupSettingsProvider

站点管理员可以通过 Web 部署使用 BackupSettingsProvider 修改其特定于站点的备份设置。 此函数允许服务器管理员准确控制站点管理员可以配置的设置。

# Allows a site administrator to enable backups and set the number of backups at the site level
Configure-BackupSettingsProvider -CanSetEnabled $true -CanSetNumBackups $true

# Allows a site administrator to control which providers they want to skip in a backup, as 
# well as whether they can continue a sync after a backup failure
Configure-BackupSettingsProvider -CanSetContinueSyncOnBackupFailure $true -CanAddExcludedProviders $true

Get-BackupSettings

查询服务器或特定于站点的备份设置。

# Grabs the global default backup settings
Get-BackupSettings

# Grabs a sites-specific backup settings
Get-BackupSettings -SiteName "foo"

Reset-BackupSettings

重置服务器或站点备份设置。 如果重置站点备份设置,它将从服务器自动继承备份设置。

# Resets the global default backup settings
Reset-BackupSettings

# Resets a sites backup settings
Reset-BackupSettings -SiteName "foo"

在 IIS 配置中手动在服务器上配置备份设置以供全局使用

全局备份设置

以下全局备份设置可以直接在 IIS 配置系统中的 %windir%\system32\inetsrv\config\applicationhost.config 下进行配置。

  • enabled -(默认值 =“false”)控制是否已启用备份。

  • backupPath -(默认值 =“{sitePathParent}{siteName}_snapshots”)备份在服务器上的存储位置。 它还支持在运行时确定的“{sitePathParent}”和“{siteName}”的路径替换变量。

    • sitePathParent - 站点内容的父级的物理文件路径。 例如,如果站点的应用程序位于 c:\inetpub\wwwroot\siteName 下,则 sitePathParent 将为 c:\inetpub\wwwroot\
    • siteName - 站点的名称。

示例:默认架构将此路径设置为“{sitePathParent}{siteName}_snapshots”,以便将每个备份置于站点内容的兄弟文件夹下,而不是置于其中。

警告:请确保 backupPath 不在站点内容路径下,否则每次发布时备份都将被删除。

  • numberOfBackups -(默认值 =“4”)将存储在服务器上的每个站点的备份数。 创建的备份数达到最大值时,最早的备份将被删除。
  • continueSyncOnBackupFailure -(默认值 =“true”)允许用户在备份因任何原因而无法完成时使同步失败或继续同步。
  • excludedProviders -(默认值 = 空集)要始终从备份中排除的 Web 部署提供程序的列表。 例如,如果在环境中单独管理数据库备份,则可以使用此设置在 Web 部署备份中排除数据库备份,方法是排除 dbFullSQLProvider。有关更多详细信息,请参阅“控制备份包含的内容”部分

注意

虽然 Web 部署在技术上允许备份几乎所有提供程序,但有些提供程序却因其性质而无法以有意义的方式还原。 基本上,任何“仅设置”提供程序而非“同步”提供程序都属于这一类别。 下面是建议添加到 ExcludedProviders 设置的内置提供程序的列表:

  • appHostAuthOverride
  • appPoolEnable32Bit
  • appPoolNetFx
  • appPoolPipeline
  • createApp
  • setAcl
  • DBSqlPackage(默认情况下未与 Web 部署一起安装,但由于备份功能当前不支持它,因此在此处列出)
  • backupSettingsProvider -(默认值:所有属性设置均为“false”)让系统管理员控制网站管理员可以设置哪些备份设置。 你可以允许网站管理员控制其网站的任何上述设置“enabled”、“numberOfBackups”、“continueOnBackupFailure”和“excludedProviders”。 这可以通过将属性“canSetEnabled”、“canSetNumberOfBackups”等设置为 true 来完成,如下例所示。

有关这些设置的完整详细信息以及允许的值可以在 IIS 配置系统的 BackupManagerSchema %windir%\system32\inetsrv\config\schema\BackupManagerSchema.xml 中找到。

下面是可以添加到 <system.webServer> 下的示例配置(有关更多详细信息,请参阅完整架构)。 无需指定以下所有设置,因为它们都具有在架构中指定的默认设置,但在此处指定它们是为了作为示例展示

<wdeploy>
    <backup enabled="true"
            numberOfBackups="2"
            backupPath="{sitePathParent}\{siteName}_siteBackups"
            continueSyncOnBackupFailure="false">
     <excludedProviders>
        <provider name="dbFullSql" />
     </excludedProviders>
     <backupSettingsProvider
            canSetEnabled="true"
            canSetNumberOfBackups="true"
            canSetContinueSyncOnBackupFailure="true"
            canSetExcludedProviders="true" />
    </backup>
</wdeploy>

假设我们有一个名为“foo”的站点,它位于服务器上的 c:\foo\wwwroot 下。 上述配置告知 Web 部署:

  1. 启用备份功能,最多保留 2 个备份。
  2. 将每个备份存储在 c:\foo\foo\_siteBackups 下的文件夹中。
  3. 如果备份操作因任何原因而失败,则使发布失败。
  4. 排除使用 dbFullSql 提供程序备份 SQL 数据库。
  5. 允许网站管理员使用 backupSettingsProvider 为其站点配置设置“enabled”、“numberOfBackups”、“continueOnBackupFailure”和“excludedProviders”。

在服务器上为特定站点配置备份设置

借助自动备份功能,还可以通过在 applicationHost.config 文件中使用 <location> 标记指定每个备份设置来设置特定于站点的设置。 如果未在位置标记中指定设置,则将从服务器设置继承该设置。 下面是站点备份设置的示例:

<location path="siteName">
    <system.webServer>
        <wdeploy>
            <backup enabled="true" numberOfBackups="4">
                <excludedProviders>
                    <clear />
                    <provider name="dbfullsql" />
                </excludedProviders>
            </backup>
        </wdeploy>
    </system.webServer>
</location>

如果要允许站点管理员能够设置自己的特定于站点的设置,则需要在服务器备份设置(而不是站点备份设置)中配置 BackupSettingsProvider 元素的“canSet*”属性。

自动备份的安全注意事项

在服务器上存储这些备份时,应确保每个用户只能访问自己的内容。 默认情况下(在完全安装期间),Web 部署会配置 BackupManager 委派规则,以确保在创建备份时它模拟为进行发布的用户。 这意味着发布用户帐户还需要具有对备份目录的“写入”文件权限。

如果不想使用最终用户标识创建其备份,只需删除此委派规则,Web 部署将使用 WMSVC 服务的标识写入备份目录。

注意

  • 委派规则仅适用于通过 WMSvc 进行连接的非管理用户。 对于管理员(通过 Web 部署代理进行连接),将使用其自己的标识。
  • 如果要手动配置委派规则,请运行 AddDelegationRules.ps1 脚本
  • 备份功能附带了 2 条新的提供程序委派规则(BackupSettings 和 BackupManager),如下所示。

Screenshot of Management Service Delegation feature page with Backup Settings and Backup Manager.

在服务器上配置站点级备份设置(适用于站点/服务器管理员)

服务器管理员可以选择将某些备份管理委托给站点管理员。 如果允许,站点管理员可以为自己的站点配置备份行为。

注意

msdeploy.exe 位于 %programfiles%\IIS\Microsoft Web Deploy V3

列出站点备份设置:在将站点名称传递到 backupSettings 提供程序时执行“转储”操作。 -xml 标志还将列出设置是否可写。

msdeploy.exe -verb:dump -source:backupSettings=<siteName> -xml

配置备份设置:在传入站点名称以及要更改的任何设置时执行“同步”操作。

msdeploy.exe -verb:sync -source:backupSettings -dest:backupSettings=<siteName>,enabled="True",numberOfBackups=3

注意

服务器管理员必须允许委派这些设置,然后你才能更改这些设置。

控制失败行为:可以通过修改“continueSyncOnBackupFailure”备份设置来控制在备份失败时是否希望继续发布的行为。 如果“continueSyncOnBackupFailure”设置为 false 且备份失败,则发布将失败,并且不会修改站点内容或数据库。

将提供程序添加到要从备份中排除的提供程序列表:指定以分号分隔的提供程序列表。 可以使用 addExcludedProviders 选项将提供程序追加到全局列表。

msdeploy.exe -verb:sync -source:backupSettings -dest:backupSettings=<siteName>,addExcludedProviders="dbFullSql;dbMySql"

将站点备份设置重置为服务器默认值:执行“删除”操作。

msdeploy.exe -verb:delete -dest:backupSettings=<siteName>

发布到已启用备份的服务器(适用于 Web 开发人员)

自动创建备份

当用户使用受支持的提供程序(iisApp、appHostConfig、contentPath)之一发布到已启用备份的服务器时,只要不跳过备份,系统就会在应用任何数据之前自动进行备份。 最终用户无需执行任何特定操作。

手动创建备份

只要为要发布到的站点配置并启用了备份,用户就可以使用 BackupManager 提供程序手动强制创建备份。 有两种方法可以手动创建备份。

  1. 指定目标站点路径 - 这将对目标站点进行简单的 iisApp 备份。

    msdeploy.exe -verb:sync -source:backupManager -dest:backupManager=siteName
    
  2. 指定源清单文件 - 这将允许备份多个提供程序(即 iisApp、dbFullSql 等)

    msdeploy.exe -verb:sync -source:backupManager=manifest.xml -dest:backupManager=siteName
    

第二个选项的简单清单文件示例如下所示:

<?xml version="1.0" encoding="utf-8"?>
<m>
  <iisApp path="siteName" />
  <dbFullSql path="connectionString" />
</m>

在发布期间跳过备份

如果客户端想要阻止进行备份,则可以使用 backupSettings 提供程序禁用服务器上的备份作为持久设置,也可以针对每个单独发布禁止在服务器上运行备份规则。 下面是有关如何禁止备份规则在发布期间运行的示例:

msdeploy.exe -verb:sync -source:iisapp=<siteName> -dest:auto,computername=<remoteComputerName> -disablerule:BackupRule

管理备份(适用于 Web 开发人员/站点管理员)

BackupManager 提供程序使客户端能够列出、还原和删除备份。 下面是有关如何执行此操作的一些示例:

列出站点的备份:执行“转储”操作以查看站点的所有备份

msdeploy.exe -verb:dump -source:backupManager=<siteName>

还原站点的特定备份:执行“同步”操作以应用备份

msdeploy.exe -verb:sync -source:backupManager -dest:backupManager=<siteName>/<backupFileName>

还原站点的最新备份:

msdeploy.exe -verb:sync -source:backupManager -dest:backupManager=<siteName>,useLatest=true

还原同时包含数据库的站点的最新备份:假定最新备份也恰好包含数据库备份。 connectionString 提供程序设置用于连接到要还原到的数据库,并且对于还原包含数据库的任何备份都是必需的,除非应用跳过规则来跳过数据库还原。

msdeploy.exe -verb:sync -source:backupManager -dest:backupManager=<siteName>,useLatest=true,connectionString=<connectionString>

使用跳过还原站点的最新备份而不覆盖 App_Data:

msdeploy.exe -verb:sync -source:backupmanager -dest:backupmanager=<siteName>,uselatst=true -skip:xpath=dirPath[@path='App_Data']

删除站点的备份:

msdeploy.exe -verb:delete -dest:backupManager=<siteName>/<backupFileName>

已知问题和限制

在以下几种情况下,即使在服务器上启用了 Web 部署,它也不会自动进行备份:

  1. 客户端使用低于 V3 RC 的 Web 部署版本进行发布。
  2. 服务器未安装至少 Web 部署 V3 RC。
  3. 清单中指定了 1 个以上的数据库 - Web 部署仅支持每次发布时备份单个数据库。
  4. 使用的提供程序的路径不是相对站点路径 - contentPath 提供程序接受物理文件路径和相对站点路径。 如果指定了物理路径,则 Web 部署不会将该提供程序计入启动备份。 apphostConfig 提供程序接受空路径。 如果指定了空路径,则 Web 部署根本不会进行备份。
  5. 清单中有存在冲突的相对路径 - 如果清单中有多个具有存在冲突的相对站点路径的提供程序,则 Web 部署不会进行备份。 例如,如果使用多个 iisApp 提供程序发布到不同的站点(一个指向站点“foo”,而另一个指向站点“bar”),则 Web 部署不会进行备份。

其他已知问题:

  1. 安装 Web 部署 V2 会中断 BackupSettings 委派规则 - 如果在 V3 之后安装 V2,则如果 BackupSettings 委派规则配置为通过默认 WDeployConfigWriter 用户运行,该规则将不再起作用。 若要解决此问题,只需从 PowerShell 运行 V3 AddDelegationRule.ps1(位于 %programfiles%\IIS\Microsoft Web Deploy\Scripts 下)脚本即可。