在 Windows Server 2008,Windows Server 2008 R2 或 Windows Server 2012 的故障转移群集中配置的 IIS 7.0 或更高版本的万维网发布服务

文章翻译 文章翻译
文章编号: 970759 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

简介

本文介绍如何在 Windows Server 2008 或 Windows Server 2008 R2 的故障转移群集中配置 Microsoft Internet Information Services (IIS) 7.5 或 IIS 7.0。这篇文章中的步骤仅适用于万维网发布服务。有关如何在故障转移群集中配置 FTP 发布服务的说明,请参阅:
974603 如何在 Windows Server 2008 故障转移群集中配置的 IIS 7.0 的 FTP 7.5

更多信息

在以前版本的 Internet Information Services,Microsoft 提供了一般资源监视器组件以支持高可用性 Web 服务器实例使用 Microsoft 群集的基础结构。但是,需要自定义代码时完全认识到这种解决方案的可能性。另外,Microsoft 提供的通用脚本不满足客户的需求。要在群集环境中使用 Windows Server 故障转移群集中配置 IIS 7.5 或 IIS 7.0,您需要使用自定义的 (脚本) 代码来启用高可用性方案。当您执行此操作时,用户可以自定义安装程序,以满足他们的需求。这让他们可以完全控制 Web 应用程序的高可用性集成。此外,IIS 7.5 和 IIS 7.0 中引入接口用于管理和监视,该脚本提供更丰富的环境比以前提供的脚本。

注意IIS 7.0 安装文件不正确地包括 Clusweb.vbs 和 Clusftp.vbs 脚本文件,IIS 在 IIS 6.0 中使用群集的管理任务。请不要使用这些脚本 IIS 7.0 或更高版本。

Microsoft 建议管理员应认真评估作为主要和首选方法改进的可扩展性和可用性的 Web 应用程序具有多个服务器,而不使用故障转移群集中运行 IIS 7.5 或 IIS 7.0 使用网络负载平衡 (NLB)。NLB 的好处之一就是所有的服务器可以积极地参与传入的 HTTP 请求的同时进行处理。另一个好处是在 NLB IIS 环境中,这样做可能会支持滚动更新和回滚,同时仍能提供高可用性的 Web 应用程序变得容易得多。有关使用 NLB 环境中的 IIS 7.5 或 IIS 7.0 的详细信息,请参阅下面的 Microsoft 网站:
http://learn.iis.net/page.aspx/213/network-load-balancing
http://technet.microsoft.com/en-us/library/cc770558.aspx
值得考虑通过群集 IIS 服务群集 IIS 不能始终保证 Web 应用程序的高可用性解决方案。启动并运行,可能是 IIS 服务 (特别是 WWW 服务),而特定应用程序池宿主进程可能已经终止,或应用程序可能会引发内部服务器 HTTP 错误。群集 Web 应用程序,并通过使用自定义脚本来监视它们的运行状况是正确和推荐的方式来实现高可用性的 IIS 群集,使用故障转移群集。下面是一个示例脚本,监视的状态来确定是否已或不启动应用程序池。

若要配置高可用性的 IIS 7.0 和 7.5 使用故障转移群集的 Web 服务器,请按照下列步骤。下面更详细地介绍步骤 3 到步骤 7。本文内下文中的示例脚本可以用作 IIS 7.0、 IIS 7.5 和 IIS 8.0 示例。
  1. 在所有群集节点上安装 Web 服务器角色。有关详细信息,请访问下面的 Microsoft Web 站点:
    http://technet.microsoft.com/en-us/library/cc771752.aspx
  2. 在所有群集节点上安装的故障转移群集功能并创建群集。有关详细信息,请访问下面的 Microsoft Web 站点:
    http://technet.microsoft.com/en-us/library/dd197477.aspx
  3. 设置将用于 IIS 共享配置文件共享。
  4. 在所有群集节点上配置 IIS 共享的配置。
  5. 在所有群集节点上配置 IIS 脱机配置文件的共享。
  6. 配置 Web 站点 (包括关联的应用程序池),并且一个群集节点上指定其内容的位置。
  7. 通过在故障转移群集中创建一个通用脚本来配置高可用性对于您的 Web 站点。

设置将用于 IIS 共享配置文件共享

  1. 创建一个将访问将 IIS 共享配置为使用该共享的用户。
  2. 创建文件共享。此共享将用于存储 IIS 共享的配置将所有群集节点上的 IIS 之间共享。有多个选项:
    • 在独立服务器上,不是任何故障转移群集的一部分,创建一个文件共享。
    • 在另一台 Windows Server 故障转移群集,创建高可用性的文件共享。有关详细信息,请访问下面的 Microsoft Web 站点:
      http://technet.microsoft.com/en-us/library/cc731844.aspx
    • 在同一个故障转移群集将承载高可用性的 Web 站点,创建高可用性的文件共享。有关详细信息,请访问下面的 Microsoft Web 站点:
      http://technet.microsoft.com/en-us/library/cc731844.aspx
  3. 在步骤 2 中创建的共享上设置的权限。为您在第 1 步到文件共享的完全控制权限和 NTFS 权限中创建该用户。
  4. 请确认所有群集节点都都可以浏览到文件共享。文件共享的路径 \\<fileserver>\<share>.</share> </fileserver>

在所有群集节点上配置 IIS 共享的配置

注意没有与 IIS 共享服务器上配置 Windows 2008 因为缺少权限应用程序主机帮助器服务问题。对于共享配置工作,必须设置 Windows 2008 服务器上 IIS 共享配置时执行以下步骤。
  1. 打开管理的命令提示符。
  2. 运行下面的命令:
    net stop apphostsvc
  3. 运行下面的命令:
    sc privs apphostsvc SeChangeNotifyPrivilege/SeTcbPrivilege/SeImpersonatePrivilege
  4. 运行下面的命令:
    net start apphostsvc
完成以下步骤在群集中的每个 Windows 2008 服务器上后,继续在这一节中设置 IIS 共享配置,如所述。

在其中一个群集节点上的文件共享导出共享的配置:
  1. 定位到 管理工具然后单击 Internet Information Services (IIS) 管理器.
  2. 在左窗格中,单击服务器节点。
  3. 双击 共享的配置 图标。
  4. 在共享配置页面上单击 导出配置 在中 操作 窗格 (右窗格),以将配置文件从本地计算机中导出到另一个位置。
  5. 在中 导出配置 对话框中,键入路径的文件共享 (\\<fileserver>\<share></share></fileserver>) 中 物理路径 框。
  6. 单击 作为连接然后键入用户名和密码的用户帐户有权访问此共享中,共享的配置存储,这然后单击 确定.此帐户将用于访问共享资源。您应使用受限的 活动目录(AD) 帐户不是域管理员。
  7. 在中 导出配置 对话框中,键入一个密码,将使用来保护加密密钥,然后单击 确定.
  8. 共享的配置 页上,单击以选中 启用共享的配置 复选框。
  9. 键入物理路径、 用户帐户和以前,您输入的密码,然后单击 应用 在中 操作 窗格。
  10. 在中 加密密钥密码 对话框中,键入加密密钥密码的更早版本,将设置,然后单击 确定.
  11. 在中 共享的配置 对话框中,单击 确定.
  12. 单击 确定.
在每个其他群集节点上使用刚才导出到文件共享的共享的配置:
  1. 定位到 管理工具然后单击 Internet Information Services (IIS) 管理器.
  2. 单击服务器节点。
  3. 双击 共享的配置 图标。
  4. 共享的配置 页上,单击以选中 启用共享的配置 复选框。
  5. 键入文件共享 (的物理路径\\<fileserver>\<share></share></fileserver>),用户帐户和密码,您以前,输入然后单击 应用 在中 操作 窗格。
  6. 在中 加密密钥密码 对话框中,键入加密密钥密码的更早版本,将设置,然后单击 确定.
  7. 在中 共享的配置 对话框中,单击 确定.
  8. 单击 确定.
注意有关如何在 IIS 中共享配置设置的详细信息,请访问下面的 Microsoft Web 站点:
http://learn.iis.net/page.aspx/264/shared-configuration

在所有群集节点上配置 IIS 脱机文件共享配置

在每个群集节点上启用脱机文件:
  1. 安装桌面体验
    1. 定位到 管理工具然后单击 服务器管理器.
    2. 在左窗格中,单击 功能.
    3. 单击 添加功能 在右窗格中。
    4. 单击以选中 桌面体验 复选框。
    5. 单击 设置 安装桌面体验。
    6. 重新启动计算机。
  2. 在控制面板中,打开 脱机文件.
  3. 单击 启用脱机文件.这一次不要重新启动计算机。
  4. 确保缓存被设置为只读。若要执行此操作,请在提升的命令窗口中运行以下命令:
    REG ADD "HKLM\System\CurrentControlSet\Services\CSC\Parameters" /v ReadOnlyCache /t REG_DWORD /d 1 /f 
    
  5. 重新启动计算机。
  6. 从该计算机浏览到文件服务器。用鼠标右键单击包含 IIS 共享的配置中,该共享,然后单击 始终可用脱机.
    注意如果要将相同的故障转移群集的高可用性的文件共享设置时,它承载 IIS 节点,始终脱机可用选项不会出现,当右击共享如果是在群集节点承载高可用文件服务器时。您需要移动到另一个节点的高可用文件服务器应用程序。
  7. 在控制面板中,打开 脱机文件.单击 打开同步中心然后单击 日程安排.
  8. 对每一天或根据要求安排脱机文件同步。您还可以配置脱机同步运行每隔几分钟。即使您未设置上一个计划程序,Applicationhost.config 文件中的内容更改时,更改将反映在 Web 服务器上。
注意有关如何在 IIS 中配置共享配置为脱机文件的详细信息,请访问下面的 Microsoft Web 站点:
http://learn.iis.net/page.aspx/212/offline-files-for-shared-configuration

配置 Web 站点 (包括关联的应用程序池),并且一个群集节点上指定其内容的位置

找到拥有群集磁盘资源的群集节点的 Web 站点的内容文件所在的位置:
  1. 定位到 管理工具然后单击 故障转移群集管理器.
  2. 连接到群集。如果您是在其中一个群集节点上,群集将自动显示在列表中。
  3. 在下 存储查找 Web 页内容将驻留在其的磁盘资源。若要执行此操作,展开存储路径树中的磁盘资源。请确保存储不使用任何其他高可用性应用程序在群集上。您将发现在下的存储 可用的存储.
  4. 注意在群集节点的该资源处于联机状态。您将在该群集节点上配置 IIS。
  5. 注意群集磁盘资源名称。您将使用此内容的文件。
在群集节点上的资源处于联机状态,将配置 Web 服务器以使用 Web 站点的内容共享的磁盘:
  1. 定位到 管理工具然后单击 Internet Information Services (IIS) 管理器.
  2. 在左窗格中,展开服务器节点。
  3. 展开 站点然后在 站点单击您要配置的站点。
  4. 在右窗格中,选择 高级的设置 在下 管理网站.
  5. 定位 物理路径 在下的属性 常规 设置,然后键入网站内容文件的位置。这是在前一过程的步骤 5 中提到的群集磁盘资源的位置。
  6. 单击 确定.

创建故障转移群集管理器中的一个通用脚本来配置您的 Web 站点的高可用性

若要配置高可用性的 IIS Web 服务器中的最后一步,设置将用于监视的 Web 站点和网站应用程序池通用脚本资源:
  1. 在每个群集节点上,将本文结尾处的脚本复制到 Windows\System32\inetsrv\Clusweb7.vbs。
  2. 默认情况下,该脚本监视被命名为"默认 Web 站点"和"默认应用程序池"名为应用程序池的网站。如果这不是正确的网站,应用程序池,更改网站名称APP_POOL_NAME变量。请确保所有群集节点上的同一 Web 站点和应用程序池脚本中的存在。请注意名称是区分大小写。
  3. 定位到 管理工具然后单击 故障转移群集管理器.
  4. 连接到群集。如果您是在其中一个群集节点上,群集将自动显示在列表中。
  5. 用鼠标右键单击该群集,然后单击 配置服务或应用程序.向导将创建高可用性的工作负荷。
  6. 单击 通用脚本.
  7. 从下面的路径选择的脚本文件: %systemroot%\System32\Inetsrv\clusweb7.vbs
  8. 客户端将用于连接到高可用性 Web 站点的 Web 站点名称设置的客户端访问点 (CAP) 名称。指定要用于 Web 站点帽的静态 Ip。如果您使用的 DHCP,则将不显示此选项。
  9. 选择存储 单步执行,请选择 Web 站点的内容文件驻留的群集共享的磁盘。存储类型应为未由任何其他的高可用性群集上应用程序使用。请注意,如果文件共享,则使用 IIS 共享配置为驻留在同一个群集上,应在此处使用不同的磁盘资源。
  10. 确认这些设置后,向导将创建群集组,群集资源和资源之间的依赖关系,然后使资源联机。
注意若要承载相同的故障转移群集上的多个高可用性的 Web 站点,请按照与上述相同的步骤。但是,对于每个 Web 站点和其他群集共享的存储中使用不同的脚本文件。例如,%systemroot%\system32\inetsrv 中使用的第一个网站的第三个,第二,clweb7 3.vbs clweb7-2.vbs clusweb7.vbs 等。每个脚本文件用于监测站点不同的站点和应用程序池。

重要下面的脚本仅用于示例并不显式支持通过 Microsoft。在群集环境中的 IIS 7.0,IIS 7.5 或 IIS 8.0 此脚本的用途是需要您自担风险。
'<begin script sample>


'This script provides high availability for IIS websites
'By default, it monitors the "Default Web Site" and "DefaultAppPool"
'To monitor another web site, change the SITE_NAME below
'To monitor another application pool, change the APP_POOL_NAME below
'More thorough and application-specific health monitoring logic can be added to the script if needed

Option Explicit

DIM SITE_NAME
DIM APP_POOL_NAME
Dim START_WEB_SITE
Dim START_APP_POOL
Dim SITES_SECTION_NAME
Dim APPLICATION_POOLS_SECTION_NAME
Dim CONFIG_APPHOST_ROOT
Dim STOP_WEB_SITE


'Note:
'Replace this with the site and application pool you want to configure high availability for
'Make sure that the same web site and application pool in the script exist on all cluster nodes. Note that the names are case-sensitive.
SITE_NAME = "Default Web Site"
APP_POOL_NAME = "DefaultAppPool"

START_WEB_SITE = 0
START_APP_POOL = 0
STOP_WEB_SITE  = 1
SITES_SECTION_NAME = "system.applicationHost/sites"
APPLICATION_POOLS_SECTION_NAME = "system.applicationHost/applicationPools"
CONFIG_APPHOST_ROOT = "MACHINE/WEBROOT/APPHOST"

'Helper script functions


'Find the index of the website on this node
Function FindSiteIndex(collection, siteName)

    Dim i

    FindSiteIndex = -1    

    For i = 0 To (CInt(collection.Count) - 1)
        If collection.Item(i).GetPropertyByName("name").Value = siteName Then
            FindSiteIndex = i
            Exit For
        End If		 
    Next

End Function


'Find the index of the application pool on this node
Function FindAppPoolIndex(collection, appPoolName)

    Dim i

    FindAppPoolIndex = -1    

    For i = 0 To (CInt(collection.Count) - 1)
        If collection.Item(i).GetPropertyByName("name").Value = appPoolName Then
            FindAppPoolIndex = i
            Exit For
        End If		 
    Next

End Function

'Get the state of the website
Function GetWebSiteState(adminManager, siteName)

    Dim sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod
    Set sitesSection = adminManager.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
    Set sitesSectionCollection = sitesSection.Collection

    index = FindSiteIndex(sitesSectionCollection, siteName)
    If index = -1 Then
        GetWebSiteState = -1
    End If	    

    Set siteSection = sitesSectionCollection(index)

    GetWebSiteState = siteSection.GetPropertyByName("state").Value

End Function

'Get the state of the ApplicationPool
Function GetAppPoolState(adminManager, appPool)

    Dim configSection, index, appPoolState

    set configSection = adminManager.GetAdminSection(APPLICATION_POOLS_SECTION_NAME, CONFIG_APPHOST_ROOT)
    index = FindAppPoolIndex(configSection.Collection, appPool)

    If index = -1 Then
        GetAppPoolState = -1
    End If	    

    GetAppPoolState = configSection.Collection.Item(index).GetPropertyByName("state").Value
End Function


'Start the w3svc service on this node
Function StartW3SVC()

    Dim objWmiProvider
    Dim objService
    Dim strServiceState
    Dim response

    'Check to see if the service is running
    set objWmiProvider = GetObject("winmgmts:/root/cimv2")
    set objService = objWmiProvider.get("win32_service='w3svc'")
    strServiceState = objService.state

    If ucase(strServiceState) = "RUNNING" Then
        StartW3SVC = True
    Else
        'If the service is not running, try to start it
        response = objService.StartService()

        'response = 0  or 10 indicates that the request to start was accepted
        If ( response <> 0 ) and ( response <> 10 ) Then
            StartW3SVC = False
        Else
            StartW3SVC = True
        End If
    End If
    
End Function


'Start the application pool for the website
Function StartAppPool()

    Dim ahwriter, appPoolsSection, appPoolsCollection, index, appPool, appPoolMethods, startMethod, callStartMethod
    Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")

    Set appPoolsSection = ahwriter.GetAdminSection(APPLICATION_POOLS_SECTION_NAME, CONFIG_APPHOST_ROOT)       
    Set appPoolsCollection = appPoolsSection.Collection

    index = FindAppPoolIndex(appPoolsCollection, APP_POOL_NAME)
    Set appPool = appPoolsCollection.Item(index)
    
    'See if it is already started
    If appPool.GetPropertyByName("state").Value = 1 Then
        StartAppPool = True
        Exit Function
    End If

    'Try To start the application pool
    Set appPoolMethods = appPool.Methods
    Set startMethod = appPoolMethods.Item(START_APP_POOL)
    Set callStartMethod = startMethod.CreateInstance()
    callStartMethod.Execute()
    
    'If started return true, otherwise return false
    If appPool.GetPropertyByName("state").Value = 1 Then
        StartAppPool = True
    Else
        StartAppPool = False
    End If

End Function


'Start the website
Function StartWebSite()

    Dim ahwriter, sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod
    Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
    Set sitesSection = ahwriter.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
    Set sitesSectionCollection = sitesSection.Collection

    index = FindSiteIndex(sitesSectionCollection, SITE_NAME)
    Set siteSection = sitesSectionCollection(index)

    if siteSection.GetPropertyByName("state").Value = 1 Then
        'Site is already started
        StartWebSite = True
        Exit Function
    End If

    'Try to start site
    Set siteMethods = siteSection.Methods
    Set startMethod = siteMethods.Item(START_WEB_SITE)
    Set executeMethod = startMethod.CreateInstance()
    executeMethod.Execute()

    'Check to see if the site started, if not return false
    If siteSection.GetPropertyByName("state").Value = 1 Then
        StartWebSite = True
    Else
        StartWebSite = False
    End If

End Function


'Stop the website
Function StopWebSite()

    Dim ahwriter, sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod, autoStartProperty
    Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
    Set sitesSection = ahwriter.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
    Set sitesSectionCollection = sitesSection.Collection

    index = FindSiteIndex(sitesSectionCollection, SITE_NAME)
    Set siteSection = sitesSectionCollection(index)

    'Stop the site
    Set siteMethods = siteSection.Methods
    Set startMethod = siteMethods.Item(STOP_WEB_SITE)
    Set executeMethod = startMethod.CreateInstance()
    executeMethod.Execute()

End Function



'Cluster resource entry points. More details here:
'http://msdn.microsoft.com/en-us/library/aa372846(VS.85).aspx

'Cluster resource Online entry point
'Make sure the website and the application pool are started
Function Online( )

    Dim bOnline
    'Make sure w3svc is started
    bOnline = StartW3SVC()

    If bOnline <> True Then
        Resource.LogInformation "The resource failed to come online because w3svc could not be started."
        Online = False
        Exit Function
    End If


    'Make sure the application pool is started
    bOnline = StartAppPool()
    If bOnline <> True Then
        Resource.LogInformation "The resource failed to come online because the application pool could not be started."
        Online = False
        Exit Function
    End If


    'Make sure the website is started
    bOnline = StartWebSite()
    If bOnline <> True Then
        Resource.LogInformation "The resource failed to come online because the web site could not be started."
        Online = False
        Exit Function
    End If

    Online = true 

End Function

 
'Cluster resource offline entry point
'Stop the website
Function Offline( )

    StopWebSite()
    Offline = true

End Function


'Cluster resource LooksAlive entry point
'Check for the health of the website and the application pool
Function LooksAlive( )

    Dim adminManager, appPoolState, configSection, i, appPoolName, appPool, index

    i = 0
    Set adminManager  = CreateObject("Microsoft.ApplicationHost.AdminManager")
    appPoolState = -1

    'Get the state of the website
    if GetWebSiteState(adminManager, SITE_NAME) <> 1 Then
        Resource.LogInformation "The resource failed because the " & SITE_NAME & " web site is not started."
        LooksAlive = false
        Exit Function
    End If


    'Get the state of the Application Pool
     if GetAppPoolState(adminManager, APP_POOL_NAME) <> 1 Then
         Resource.LogInformation "The resource failed because Application Pool " & APP_POOL_NAME & " is not started."
         LooksAlive = false  
	 Exit Function
     end if

     '  Web site and Application Pool state are valid return true
     LooksAlive = true
End Function


'Cluster resource IsAlive entry point
'Do the same health checks as LooksAlive
'If a more thorough than what we do in LooksAlive is required, this should be performed here
Function IsAlive()   

    IsAlive = LooksAlive

End Function


'Cluster resource Open entry point
Function Open()

    Open = true

End Function


'Cluster resource Close entry point
Function Close()

    Close = true

End Function


'Cluster resource Terminate entry point
Function Terminate()

    Terminate = true

End Function
'<end script sample>

属性

文章编号: 970759 - 最后修改: 2013年3月18日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft Internet Information Services 8.0
  • Microsoft Internet Information Services 7.5
  • Microsoft Internet Information Services 7.0
  • Windows Server 2012 Datacenter
  • Windows Server 2012 Standard
  • Windows Server 2008 R2 Datacenter
  • Windows Server 2008 R2 Enterprise
  • Windows Server 2008 Service Pack 2
  • Windows Server 2008 Datacenter
  • Windows Server 2008 Enterprise
关键字:?
kbclustering kbhowto kbsurveynew kbmt KB970759 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 970759
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com