使用 IIS 7 的共享配置

介绍

Internet 改变了公司处理日常业务的方式以及他们在市场中竞争的方式。 随着新的 Web 技术的出现以及通过 Web 访问可用资源的客户数量增加,迫切需要提高应用程序的可伸缩性、可用性、可靠性和可管理性。 应用程序应该依赖于能够提供高正常运行时间、提高请求吞吐量、增加并发用户事务以及比竞争系统更好的投资回报价值(如更好的服务质量)的系统。

Web 场(服务器群集)已成为一种标准,有助于通过分配负载来提供高度可缩放、可用且可管理的应用程序。 更具体地说,这些应用程序属性是 Web 场和负载均衡背后的主要原因。 通过使用 Web 场,组织可以提供一种可缩放的方式来增加同时访问应用程序及其资源的用户群的容量。

服务器群集通过让多个服务器分配负载来提高可用性。 群集还可以在任何给定时间点更好地扩展到增加的客户数量。 最后,群集通过轻松地处理 Web 场体系结构的预配和管理而不使操作资源紧张,从而提供了改进的管理体验。

概述

本文重点介绍共享的集中式全局配置功能。 此功能有助于支持同质 Web 场,其中服务器跨服务器组共享同一配置。 通过使用 UNC 共享,对中央主配置文件所做的任何更改都会传播到不同的服务器,而无需额外的工具或编程支持。

本文的第一部分介绍如何使用 IIS 7 及更高版本的管理 UI 来启用和使用共享配置。 第二部分介绍如何从命令行启用和使用共享配置。

非目标:本文未涵盖的内容

多个方面都有助于成功的 Web 场环境,包括正确的可支持性、可管理性、可访问性、可伸缩性等。

共享配置仅侧重于 Web 场的配置管理方面,并处理跨服务器的配置。 有一些工具和其他功能可帮助管理多个服务器、复制内容、部署模块、同步应用程序二进制文件、设置第三方组件等。这些工具、功能和方面不在本文的讨论范围内。

本文仅详细介绍如何跨服务器使用中央文件来维护配置。

因此,请注意,共享配置使服务器能够访问后端 UNC 共享中的配置文件,就好像它是其本地配置一样。 因此,使用前端 Web 服务器更新配置时,将对所有其他服务器进行更新。

请务必考虑其他情况,例如安装第三方模块或添加配置设置,并包括只有一台服务器能够理解的属性,以及可用于正确运行的二进制文件和架构。 否则,这种类型的使用可能会中断其他服务器。

为了避免同质场中出现此问题,应在群集上禁用共享配置,更新本地 applicationHost 文件,使其镜像远程文件,在单个服务器上部署和更新模块和配置,然后在该服务器上重新启用共享配置。 然后,可以在服务器其余部分部署和更新二进制文件和模块,然后再次启用共享配置。

域和非域环境

某些管理员在域环境中部署 Web 服务器群集,而另一些管理员则部署在工作组(非域)中。 本文讨论了这两种方案,并指出了区别和注意事项。 建议借助 Active Directory 使用域控制器提供的帮助和安全性,在域中的群集中设置 IIS。

先决条件

必须按顺序完成以下步骤:

  1. 在你的服务器上安装 IIS,在本文中,该服务器将被称为 Web 服务器。
  2. 确保访问另一台服务器,在本文中,该服务器将被称为文件服务器。 文件服务器将容纳配置和基本内容的共享,可以使用 UNC 访问这些共享。
  3. 本文的每个步骤都假定上一步已完成。 按顺序执行所有步骤。
  4. 对于某些步骤,可以使用 UI 完成等效的步骤。 除非另行指定,否则只执行一种类型的步骤。

集中式配置

IIS 管理 UI 支持设置配置重定向并将配置文件以及必要的加密密钥导出到指定路径。

使用 UI 导出文件和设置配置重定向

  1. 打开 IIS 管理器。
  2. 在树视图中,选择要为其设置配置重定向的服务器连接。
  3. 双击“共享配置”。
    已选中“共享配置”图标的“I S 管理器”的屏幕截图。
  4. 在“操作”窗格中,单击“导出配置...”以将所需的配置文件从本地服务器导出到另一个位置(例如 UNC 共享)。
    “共享配置”中的“操作”窗格的屏幕截图,其中突出显示了“导出配置点点点”。
  5. 在“导出配置”对话框中,输入要导出文件的路径。 输入密码来保护同样导出的加密密钥。 单击“确定”以导出配置文件和受密码保护的加密密钥。
    “导出配置”对话框的屏幕截图,其中显示了“配置位置和加密密钥密码”字段。
  6. 选中“启用共享配置”复选框以启用配置重定向。
    “共享配置”对话框的屏幕截图,其中突出显示了“启用共享配置”。
  7. 指定配置和加密密钥所在的路径,并指定用于访问该路径的凭据。 单击“连接方式...”并输入凭据。
    “共享配置”对话框的屏幕截图,其中输入了用户名和密码的凭据。
  8. 单击“应用”保存设置。 在“共享配置”对话框中,输入为保护加密密钥而指定的密码。
    “共享配置”对话框的屏幕截图,其中显示了用于输入加密密钥密码的字段。
  9. 单击“确定”以完成设置配置重定向。

上述步骤介绍如何导出配置并启用集中式配置。 但是,只需导出配置一次。 对将使用集中式配置的每个后续服务器执行步骤 6 到 9。

有关使用 UI 的说明

设置配置重定向时,导出的文件应已使用 UI 导出。 这是因为 UI 使用自己的自定义格式导出和导入受密码保护的加密密钥等项目。

例如,如果将 administration.config 和 applicationHost.config 文件手动复制到共享,然后手动导出加密密钥,则无法使用 UI 设置配置重定向以指向这些文件。 这是因为导出的加密密钥不会采用 UI 所需的格式。

命令提示符

在本文的其余部分,必须使用命令提示符来运行某些命令。 建议使用具有提升的用户权限的命令提示符,因为如果运行正常的命令提示符,某些命令将不起作用。

使用提升的用户权限打开命令提示符

  1. 单击“启动”。
  2. 单击“所有程序”。
  3. 单击“附件”。
  4. 右键单击“命令提示符”并选择“以管理员身份运行”。
  5. 按照出现的任何对话框中的提示进行操作。

备份当前 applicationHost.config 文件

尝试新功能或更改多个配置设置时,最好备份当前 applicationHost.config 文件。

备份 applicationHost.config 文件

  1. 打开命令提示符。

  2. 导航到 IIS 目录,默认情况下该目录位于 %WINDIR%\System32\InetSrv 中。 配置文件存储在 InetSrv\Config 目录中。 使用 AppCmd 工具通过运行以下命令创建备份对象并备份 applicationHost.config 文件:

    cd /d %windir%\system32\inetsrv
    appcmd add backup centralConfigBackup
    

    注意

    AppCmd 工具驻留在 InetSrv 目录中。 必须从此目录访问该工具,除非工具的路径已添加到系统的环境变量中。

  3. 通过运行以下命令,确保备份对象(包括 applicationHost.config 文件以及 SMTP 和其他非 Web 服务器设置的旧元数据库文件)存在:

    appcmd list backup
    

将当前配置文件替换为备份文件

  1. 打开命令提示符。

  2. 导航到 IIS 目录,默认情况下该目录位于 InetSrv 目录中。 通过运行以下命令,还原 AppCmd 备份文件对象:

    cd /d %windir%\system32\inetsrv\
    appcmd restore backup centralConfigBackup
    

创建用户以访问用于配置的 UNC 共享

在域环境中,管理员必须在域中提供或创建一个帐户,以便与 Active Directory 一起使用。 必须使用正确的用户权限设置此帐户才能访问 UNC 共享。

在非域环境中,管理员必须在两个服务器上创建具有用户访问权限的本地用户才能访问内容。 若要在此设置中正常工作,服务器之间的用户名和密码必须相同。 以下步骤有助于创建用户以读取共享配置所在的共享。

创建可读取共享配置所在的共享(非域)的用户

  1. 打开命令提示符。

  2. 在 Web 服务器(安装了 IIS 的前端服务器)上,运行以下命令来创建一个名为 ConfigUser1、密码为 ConfigPass1 的用户:

    net user ConfigUser1 ConfigPass1 /add
    
  3. 在文件服务器(中央配置所在的后端服务器)上,运行以下命令来创建一个名为 ConfigUser1、密码为 ConfigPass1 的用户:

net user ConfigUser1 ConfigPass1 /add

为中央配置和内容创建 UNC 共享

用于配置的 UNC 共享托管了要从此集中位置获取配置数据的任何服务器的 applicationHost.config 文件。

创建 UNC 共享

  1. 在文件服务器上,打开命令提示符。

  2. 导航到驱动器的根目录。 运行以下命令,创建用于配置的目录并共享此目录,确保向用户授予读取和写入目录的权限:

    md %SystemDrive%\centralconfig
    net share centralconfig$=%SystemDrive%\centralconfig /grant:Users,Change
    

    注意

    此命令会自动将用户权限授予此共享的用户组。 为非域方案创建的用户会自动被授予更改权限,如果需要,可以进一步限制这些权限。 对于域方案,用户必须显式设置用户权限以访问共享,或者添加到系统中的用户组。

  3. 非域方案:若要提高共享的安全性,可以将 /grant 开关的 Users,Change 部分替换为 ConfigUser1,Change 参数。 只有指定的用户才能访问共享。

  4. 域方案:若要提高共享的安全性,可以将 /grant 开关的 Users,Change 部分替换为 domain\user,Change 参数。 只有指定的用户才能远程访问共享。

    注意

    共享上的用户权限是远程和本地文件系统用户权限之间的联合。 必须将相应的用户权限设置为域帐户的目录,才能成功读取配置共享。

向承载中央配置和内容的 UNC 共享的帐户授予用户权限

必须确保用于访问配置的帐户具有适当的用户权限。 IIS 使用此帐户来访问 UNC 共享,访问方式与将虚拟目录映射到 UNC 共享时访问内容的方式相同。 仅访问共享时,此帐户的读取用户权限非常有用。 之后,每当 IIS 读取配置文件时,它将还原回调用方具有的标识:API、正在使用的管理工具或此时登录的用户。

注意

ConfigUser1 帐户(或用于读取配置的等效域帐户)与用于写入配置的帐户不同。 这些帐户不需要具有对共享或配置文件的写入用户权限。

向 UNC 共享(域)的帐户授予用户权限

  1. 如果域帐户是本地用户组的一部分,并且在创建共享时授予了用户访问权限,则可以跳过域设置的下一步。 但是,如果用于访问本地文件共享的域帐户不属于任何本地用户组,则必须执行该命令来授予用户权限。
  2. 在文件服务器上,打开命令提示符。
  3. 通过运行以下命令,向域帐户提供用户权限,以读取在其中存储配置的目录:
icacls %SystemDrive%\centralconfig\ /grant domain\user:R

添加 UNC 用户(非域和域)

对于域和非域方案,用户名必须包括登录批处理作业配置。 这不是 Windows Server® 2008 中的默认设置;必须手动将其添加到 Web 服务器。

  1. 单击“启动”。 单击“管理工具”并选择“本地安全策略”。
  2. 在“本地策略”下,选择“用户权限分配”。
  3. 双击“以批处理作业身份登录”并添加创建的 UNC 用户。

重定向配置

介绍

完成上述步骤后,Web 服务器正常运行,前端 Web 服务器应使用 localhost 环回地址为默认网站提供服务。

现在可以将配置移动到中心位置。 这样,你可以将文件声明为主控文件,并将其保存在 UNC 共享中,以便配置多个服务器。 更改此文件一次将同时预配和更新所有服务器配置。

将配置存储在 UNC 共享中

  1. 将前端 Web 服务器上的 %windir%\system32\inetsrv\config 目录中的 applicationHost.configadministration.config 文件复制到后端文件服务器上的共享。 如果当前登录的用户帐户具有后端共享的写入访问权限,则可以在目录中删除该文件。 如果没有,则必须在后端对用户帐户进行身份验证才能完成此步骤。

  2. 访问前端服务器配置目录中的现有 redirection.config XML 文件:

    • 使用 Windows 资源管理器导航到 %windir%\system32\inetsrv\config
    • 打开 redirection.config 文件。 设置 Web 服务器时,将创建此文件及其内容。 工具和 API 可以访问此文件,以确定是否启用了此功能。
  3. 打开 redirection.config 文件。 使用正确的服务器名称、用户名和密码为你的环境设置以下配置。

    <configuration> 
        <configSections> 
            <section name="configurationRedirection" /> 
        </configSections> 
        <configurationRedirection enabled="true" path="\\machinename\centralconfig$\" userName="ConfigUser1 or domain\user" password="ConfigPass1 or domainPassword" /> 
    </configuration>
    
  4. 保存 redirection.config 文件。 可以再次访问站点,但配置现在存储在 UNC 共享中。

测试配置

从后端引用配置时,有两个关键方案设计了此功能。 可以通过两种方式更新前端 Web 服务器中的配置:

  1. 可以直接在文件共享中编辑 applicationHost.config 文件。 完成此操作后,将发出更改通知,Web 服务器会选取文件中的更改。
  2. 可以在后端文件共享中添加另一个 applicationHost.config 文件,并将 Web 服务器的 redirection.config 文件更改为指向该文件的新版本。 这对于回滚或预留部署非常有用。

总结

本文介绍了新的集中式配置功能。 利用此功能,在 Web 场环境中拥有同类群集的管理员能够以无缝方式设置配置并将其部署到所有服务器。

一旦设置了该功能,无论是在 UNC 共享的文件中进行更改,还是将服务器重定向到另一个位置,Web 服务器都会立即获取这些更改。 只有影响多个站点和应用程序的全局更改会导致它们回收,但如果在局部范围进行了更改,则不会重启其余站点和应用程序。

附录 1:以编程方式访问 Redirection.config 文件以读取值

此步骤提供了一个示例,演示如何利用新的 COM AHADMIN API 以编程方式访问 redirection.config 文件。 使用 AHADMIN COM API 从本机代码或脚本和托管代码实现此 API。

以编程方式读取值

  1. 创建文本文件,并使用 .js 扩展名保存它。 以下脚本提供了有关如何读取环境的已启用属性、服务器名称、用户名和密码的示例:

    try
    {
      var config = WScript.CreateObject( "Microsoft.ApplicationHost.AdminManager" );
      var section = config.GetAdminSection( "configurationRedirection", "MACHINE/REDIRECTION" );
    
      WScript.Echo( "Current redirection:" );
      WScript.Echo( "enabled = " + section.Properties.Item( "enabled" ).Value );
      WScript.Echo( "path = " + section.Properties.Item( "path" ).Value );
      WScript.Echo( "user = " + section.Properties.Item( "userName" ).Value );
      WScript.Echo( "pass = " + section.Properties.Item( "password" ).Value );
    }
    catch(e)
    {
      WScript.Echo(e.number);
      WScript.Echo(e.description);
    }
    
  2. 保存 redirection.js 文件。 现在,由于 Windows 脚本宿主 (WSH),可以从命令提示符运行此文件。

附录 2:以编程方式访问 redirection.config 文件以写入值

此步骤提供了一个示例,演示如何利用新的 COM AHADMIN API 以编程方式访问 redirection.config 文件。 从本机代码或从其 COM 对象的脚本和托管代码使用此 API。

以编程方式写入值

  1. 创建文本文件,并使用 .js 扩展名保存它。 以下脚本提供了有关如何写入环境的已启用属性、服务器名称、用户名和密码的示例:

    try
    {
        var config = WScript.CreateObject( "Microsoft.ApplicationHost.WritableAdminManager" );
      config.CommitPath = "MACHINE/REDIRECTION";
        var section = config.GetAdminSection( "configurationRedirection","MACHINE/REDIRECTION" );
      section.Properties.Item( "enabled" ).Value = true;
      section.Properties.Item( "path" ).Value = "\\\\somemachine\\sharefile://folder/";
      section.Properties.Item( "userName" ).Value = "testuser";
      section.Properties.Item( "password" ).Value = "testuser";
      config.CommitChanges();
    }
    catch(e)
    {
      WScript.Echo(e.number);
      WScript.Echo(e.description);
    }
    
  2. 保存 redirection.js 文件。

  3. 现在,由于 Windows 脚本宿主 (WSH),可以从命令提示符运行此文件。

附录 3:处理计算机特定的加密属性

默认情况下,IIS 包括用于保护属性的两个主要提供程序。 这些提供程序位于 applicationHost.config 文件的 <configProtectedData> 配置部分中,并在 <providers> 元素中定义。

AesProvider 专门用于处理 system.webServer 部分中的属性的加密和解密。

IISWASOnlyRsaProvider 专门用于处理 system.applicationHost 部分中的属性的加密和解密。

这些密钥位于 iisConfigurationKey 和 iisWasKey 密钥容器中,并且特定于计算机。 在 Web 场方案中,如果需要加密,则会导出一台计算机(通常是创建 applicationHost.config 文件的计算机)的密钥并将其引入其他计算机,以便 Web 服务器可以解密和使用安全属性。

步骤

  1. 打开命令提示符。 导航到 Framework 目录,默认情况下该目录位于 %windir%\Microsoft.NET\Framework\v2.0.50727\ 中。

    注意

    作为参考,系统的计算机密钥位于 %ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys\

  2. 使用 aspnet_regiis 工具导出密钥。 用于传输配置密钥的命令如下所述。 px 开关标识你想要导出 RSA 密钥对。 pri 开关标识你还想要同时包含私钥和公钥。

    此开关标识是加密和解密所必需的;否则,只能使用导出的密钥加密数据。 -px 后面的参数是要导出的密钥容器的名称。 在本例中,它是“iisConfigurationKey”密钥容器。 IIS 使用的另一个密钥容器是“iisWasKey”密钥容器。

    aspnet_regiis -px "iisConfigurationKey" "D:\iisConfigurationKey.xml" -pri
    
  3. 导出成功完成后,请将 XML 文件复制到群集中的其他计算机,以准备将其导入其中。

  4. 导航到 Framework 目录,并使用 aspnet_regiis 工具从 XML 文件导入密钥。 用于完成密钥传输的命令如下所述。

    -pi 后面的参数是要导入的密钥容器的名称。 在本例中,它是“iisConfigurationKey”密钥容器。 IIS 使用的另一个密钥容器是“iisWasKey”密钥容器。

    aspnet_regiis -pi "iisConfigurationKey" "D:\iisConfigurationKey.xml"