本文主要是从:http://support.microsoft.com/kb/970759/zh-cn,直接转载,稍作修改裁剪而来,其中红色粗体部分,是我特别要说明的

若要配置 IIS 7.0 和 7.5 Web 服务器使用故障转移群集的高可用性,请按照下列步骤。下面更详细地介绍步骤 3 到步骤 7。本文内下文中的示例脚本可以用作任务的示例 IIS 7.0、 IIS 7.5 和 IIS 8.0。  其实应该还有DNS,AD,iscsi target 服务配置

  1. 在所有群集节点上安装 Web 服务器角色。有关详细信息,请访问下面的 Microsoft 网站:
    http://technet.microsoft.com/en-us/library/cc771752.aspx
  2. 在所有群集节点上安装的故障转移群集功能,并创建群集。有关详细信息,请访问下面的 Microsoft 网站:
    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 之间共享。有多个选项(选择其中之一即可):
  3. 在您在步骤 2 中创建的共享上设置的权限。为您在步骤 1 的文件共享的完全控制权限和 NTFS 权限的用户。
  4. 请确认所有群集节点都都可以浏览到该文件共享。文件共享的路径 \\ < 文件服务器 > \ < 共享 >。

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

注意:没有与 IIS 共享服务器上配置 Windows 2008 因为缺少权限应用程序主机帮助器服务的问题。为共享配置工作,您必须执行以下步骤,Windows 2008 服务器上的 IIS 共享配置设置时。

  1. 打开管理的命令提示符。
  2. 运行以下命令:
    net stop apphostsvc
  3. 运行以下命令:
    sc privs apphostsvc SeImpersonatePrivilege/SeChangeNotifyPrivilege/SeTcbPrivilege   这一行命令,原始的中文文档有问题,我改过
  4. 运行以下命令:
    net start apphostsvc   这一行命令,原始的中文文档有问题,我改过

完成这些步骤在群集中的每个 Windows 2008 服务器后,请在本节中继续设置 IIS 共享的配置,如所述。

在其中一个群集节点上的文件共享导出共享的配置:

  1. 导航到管理工具,然后单击Internet Information Services (IIS) 管理器
  2. 在左窗格中,单击服务器名称节点。
  3. 双击共享配置图标。
  4. 在共享配置页中,单击导出配置导出配置文件操作窗格 (右窗格) 中从本地计算机到另一个位置。
  5. 将配置导出对话框中,键入文件共享的路径 (\\ < 文件服务器 > \ < 共享 >) 中的物理路径框。
  6. 单击连接,然后键入用户名和密码的用户帐户具有访问该共享的共享的配置存储,然后单击确定此帐户将用于访问共享资源。您应使用受限的 Active Directory 帐户不是域管理员。
  7. 将配置导出对话框中,键入一个密码,用以保护加密密钥,然后单击确定
  8. 共享配置页中,单击以选中启用共享的配置复选框。
  9. 键入物理路径、 用户帐户,以及以前,您输入的密码,然后单击操作窗格中的应用
  10. 加密密钥密码对话框中,键入加密密钥密码的更早版本,将设置,然后单击确定
  11. 共享配置对话框中,单击确定
  12. 单击确定

在每个其他群集节点,请使用您刚导出的文件共享的共享的配置:
假如你这个共享存储是同一个故障转移集群中做的,必须要将相关的资源,切换到这台机器上,才能做

  1. 导航到管理工具,然后单击Internet Information Services (IIS) 管理器
  2. 单击服务器名称节点。
  3. 双击共享配置图标。
  4. 共享配置页中,单击以选中启用共享的配置复选框。
  5. 键入该文件共享的物理路径 (\\ < 文件服务器 > \ < 共享 >),该用户帐户,并且密码之前,输入然后在操作窗格中单击应用
  6. 加密密钥密码对话框中,键入加密密钥密码的更早版本,将设置,然后单击确定
  7. 共享配置对话框中,单击确定
  8. 单击确定

注意:有关如何设置共享配置 IIS 中的详细信息,请访问下面的 Microsoft 网站:

http://learn.iis.net/page.aspx/264/shared-configuration

在所有群集节点上配置 IIS 脱机文件共享配置(似乎这一步不做也是可以的,我就没做

在每个群集节点上,启用脱机文件:

  1. 安装桌面体验
    1. 导航到管理工具,然后单击服务器管理器
    2. 在左窗格中,单击功能
    3. 在右窗格中,单击添加功能
    4. 单击以选中桌面体验复选框。
    5. 单击安装以安装桌面体验。
    6. 重新启动计算机。
  2. 在控制面板中,打开脱机文件
  3. 单击启用脱机文件不要不重新启动计算机,请稍后。
  4. 确保将高速缓存设置为只读若要执行此操作,可提升的cmd窗口中运行以下命令:
    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 网站:

http://learn.iis.net/page.aspx/212/offline-files-for-shared-configuration

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

查找拥有群集磁盘资源的群集节点的 Web 站点的内容文件所在的位置:

  1. 导航到管理工具,然后单击故障转移群集管理器
  2. 连接到群集。如果您是在一个群集节点上,群集将自动显示在列表中。
  3. 存储下查找网页内容将驻留在其的磁盘资源。若要执行此操作,展开存储树中的磁盘资源。请确保存储未由任何其他高可用性应用程序在群集上。您会发现在可用存储下的存储。
  4. 注意群集节点的该资源处于联机状态。您将在该群集节点上配置 IIS。
  5. 注意群集磁盘资源名称。您将使用此内容的文件。

在群集节点上的资源处于联机状态,Web 服务器配置为使用 Web 站点的内容的共享的磁盘:

  1. 导航到管理工具,然后单击Internet Information Services (IIS) 管理器
  2. 在左窗格中,展开服务器节点。
  3. 展开网站,然后单击站点下的正在配置的站点。
  4. 在右窗格中,选择管理 Web 站点下的高级设置
  5. 找到的物理路径属性在常规设置,然后键入在 Web 站点的内容文件的位置的位置。这是您在前一过程的第 5 步中记下的群集磁盘资源的位置。♢其实这个群集磁盘资源,有安全方面的要求,域账号有读写权限,包括以后新建的虚拟应用程序,使用新的群集磁盘资源,也要设置域账号有读写权限。♢ 对于ASP.NET 应用程序,还要设置该域账号对C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files 有读写的权限 ♢ 应用程序的物理路径凭据,也要设置为该域账号
  6. 单击确定

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

若要配置高可用性的 IIS Web 服务器中的最后一步,设置可用于监视的 Web 站点和网站应用程序池通用脚本资源:

  1. 在每个群集节点上,Windows\System32\inetsrv\Clusweb7.vbs 将这篇文章的末尾此脚本。 注意这个脚本不能保存带有编码格式的
  2. 默认情况下,脚本监视网站名为"默认 Web 站点"和名为"默认应用程序池"应用程序池。如果这不是正确的 Web 站点和应用程序池,更改网站名称APP_POOL_NAME变量。请确保所有群集节点上存在相同的 Web 站点和应用程序池脚本中。请注意名称区分大小写。
  3. 导航到管理工具,然后单击故障转移群集管理器
  4. 连接到群集。如果您是在一个群集节点上,群集将自动显示在列表中。
  5. 用鼠标右键单击该群集,然后单击配置服务或应用程序向导将创建高可用性的工作负荷。
  6. 单击通用脚本
  7. 从以下路径中选择脚本文件: %systemroot%\System32\Inetsrv\clusweb7.vbs
  8. 客户端将用于连接到高可用性的 Web 站点的 Web 站点名称设置的客户端访问点 (CAP) 的名称。指定静态的 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>

posted on 2014-04-11 10:57  Shark Xu  阅读(8109)  评论(1编辑  收藏  举报
为汶川地震死难者哀悼!