作者 :艾略特·哈迈
介绍
在 V3 中,Web 部署引入了 IIS 7 及更高版本的自动服务器端备份功能。 当服务器上配置了自动备份后,用户使用 Web 部署发布到其站点时,系统会先对实时站点进行备份,并将备份存储在服务器上,然后再将任何更改提交到站点。 如果发布由于某种原因而失败,或者用户希望还原其网站的早期版本,则他们将能够从这些备份中还原,而无需服务器管理员参与。 在最终用户可以利用此功能之前,需要由服务器管理员启用和配置此功能。
创建备份时
当 Web 部署检测到用户使用 contentPath、iisApp 或 appHostConfig 提供程序发布时,它将自动启动备份(如果服务器上已启用)。 在许多情况下,这些提供程序也包含在使用 WebMatrix 和 Visual Studio 进行的发布中。 下面是同步的命令行示例,该同步将使用 Web 部署代理在“remoteComputerName”上启动备份。
msdeploy.exe -verb:sync -source:iisapp=<siteName> -dest:auto,computername=<remoteComputerName>
如果源提供程序是清单,则 Web 部署将检查清单中的所有提供程序,以确定清单中的任何提供程序是否为 contentPath、iisApp 或 appHostConfig 提供程序。 如果是,则会为所有提供程序启动备份(有关例外情况,请参阅清单中的“已知问题和限制”部分)。 但是,如果存在路径冲突(例如一个指向站点“foo”,而另一个指向站点“bar”,则 Web Deploy 不会进行备份。
备份包含的内容
默认情况下,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
这会将以下函数加载到可用于配置备份的会话中。
- TurnOn-Backups:打开/关闭整个服务器的备份。
- 配置备份:设置默认服务器或特定于站点的备份设置。
- Configure-BackupSettingsProvider:控制站点管理员对其备份行为的控制程度的服务器设置。
- Get-BackupSettings:查询服务器或站点专属的备份设置
- Reset-BackupSettings:重置服务器或特定于站点的备份设置
TurnOn-Backups 函数:
允许服务器管理员在 服务器 范围内打开或关闭备份,而无需覆盖站点特定的设置。 默认情况下,备份处于关闭状态。 即使在启用备份后,仍必须在服务器或站点级别“启用”备份才能进行备份。
# Turns on all backup functionality
TurnOn-Backups -On $true
# Turns off all backup functionality
TurnOn-Backups -On $false
配置备份:
允许服务器管理员在 服务器 或 站点 特定的范围内配置默认备份行为。 如果管理员在服务器范围内指定了设置,并且站点已指定了特定于站点的设置,则 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:
网站管理员可以将 BackupSettingsProvider 与 Web 部署配合使用来修改其站点特定的备份设置。 此函数允许服务器管理员准确控制站点管理员可以配置的设置。
# 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"
重置-备份设置
重置服务器或站点备份设置。 如果重置站点备份设置,它将自动从服务器备份设置继承。
# 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 - 您网站内容父级的物理文件路径。 例如,如果站点的应用程序位于
示例:默认架构将此路径设置为“{sitePathParent}{siteName}_snapshots”,以便将每个备份放置在网站内容的同级文件夹下,而不是放在其中。
警告: 请确保 backupPath 不会位于站点内容路径下,否则备份将在每次发布时删除。
- numberOfBackups - (默认值 = “4”) 将存储在服务器上的每个站点的备份数。 创建最大备份数后,将删除最早的备份。
- continueSyncOnBackupFailure - (默认值 = “true”)允许用户在备份因任何原因未能完成时选择是否继续同步。
- excludeedProviders - (默认值 = 空集) 要始终从备份中排除的 Web 部署提供程序列表。 例如,如果在环境中单独管理数据库备份,则可以使用此设置通过排除 dbFullSQLProvider 作为 Web 部署备份的一部分来排除数据库备份。有关详细信息,请参阅“控制备份包含的内容”部分。
注释
尽管 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 Deploy 如下所示:
- 启用备份功能,并最多保留 2 个备份。
- 将每个备份存储在文件夹下
c:\foo\foo\_siteBackups。 - 如果备份操作因任何原因而失败,则发布失败。
- 排除使用 dbFullSql 提供程序备份 SQL 数据库。
- 允许网站管理员使用 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 Deploy 会配置 BackupManager 的委派规则,以确保它在创建备份时,以正在进行发布操作的用户身份进行模拟。 这意味着发布用户帐户还需要对备份目录具有“写入”文件权限。
如果不想使用最终用户标识创建其备份,只需删除此委派规则,Web 部署将使用 WMSVC 服务的标识写入备份目录。
注释
- 委派规则仅适用于通过 WMSvc 进行连接的非管理用户。 对于管理员(通过 Web 部署代理进行连接),将使用其自己的标识。
- 如果要手动配置委派规则, 请运行我们的 AddDelegationRules.ps1 脚本。
- 备份功能附带了 2 个新的提供程序委派规则(BackupSettings 和 BackupManager),如下所示。
在服务器上配置 Site-Level 备份设置(对于站点/服务器管理员)
服务器管理员可以选择将某些备份管理委托给站点管理员。 如果允许,站点管理员可以为其自己的站点配置备份行为。
注释
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 提供程序手动强制创建备份。 创建手动备份的方法有两种。
指定目标站点路径 - 这将对目标站点执行简单的 iisApp 备份。
msdeploy.exe -verb:sync -source:backupManager -dest:backupManager=siteName指定源清单文件 - 这将允许你备份多个提供程序(例如 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>
通过使用 Skips 来还原站点的最新备份而不覆盖 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 部署在服务器上启用,Web 部署也不会自动为你执行备份:
- 客户端使用比 V3 RC 版本更早的 Web 部署工具进行发布。
- 服务器至少未安装 Web 部署 V3 RC。
- 清单中指定了 1 个以上的数据库 - Web 部署仅支持为每个发布创建单个数据库的备份。
- 使用的提供程序的路径不是相对站点路径 - contentPath 提供程序接受物理文件路径和相对站点路径。 如果指定了物理路径,则 Web Deploy 不会将该提供程序计入启动备份。 apphostConfig 提供程序接受空路径。 如果指定了空路径,则 Web 部署根本不会执行备份。
- 清单中的相对路径冲突 - 如果清单中有多个具有冲突相对站点路径的提供程序,则 Web 部署不会进行备份。 例如,如果要将多个 iisApp 提供程序发布到不同的站点(一个指向站点“foo”,另一个指向站点“bar”)时,Web 部署将不会进行备份。
其他已知问题:
-
安装 Web 部署 V2 使 BackupSettings 委派规则失效 - 如果在 V3 之后安装 V2,并且 BackupSettings 委派规则配置为使用默认的 WDeployConfigWriter 用户运行,则该规则将不再有效。 若要解决此问题,只需从 PowerShell 运行 V3 AddDelegationRule.ps1(位于
%programfiles%\IIS\Microsoft Web Deploy\Scripts)脚本即可。