本文主要是从: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 服务配置
- 在所有群集节点上安装 Web 服务器角色。有关详细信息,请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/cc771752.aspx() http://technet.microsoft.com/en-us/library/cc771752.aspx
- 在所有群集节点上安装的故障转移群集功能,并创建群集。有关详细信息,请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/dd197477.aspx() http://technet.microsoft.com/en-us/library/dd197477.aspx
- 设置将用于 IIS 共享配置文件共享。
- 在所有群集节点上配置 IIS 共享的配置。
- 在所有群集节点上配置 IIS 脱机配置文件的共享。 这一步可以不做,我就没做
- 配置 Web 站点 (包括关联的应用程序池),并且一个群集节点上指定其内容的位置。
- 通过创建一个通用脚本,在故障转移群集中配置您的 Web 站点的高可用性。
设置将用于 IIS 共享配置文件共享
- 创建一个将访问 IIS 共享的配置将使用该共享的用户。
- 创建文件共享。此共享将用于存储 IIS 共享的配置将所有群集节点上的 IIS 之间共享。有多个选项(选择其中之一即可):
- 在独立服务器上,不是任何故障转移群集的一部分,创建一个文件共享。
- 在另一台 Windows 服务器故障转移群集中,创建一个高可用性的文件共享。有关详细信息,请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/cc731844.aspx() http://technet.microsoft.com/en-us/library/cc731844.aspx
- 在承载高可用性 Web 站点相同的故障转移群集,创建高可用性的文件共享。有关详细信息,请访问下面的 Microsoft 网站:
- 在您在步骤 2 中创建的共享上设置的权限。为您在步骤 1 的文件共享的完全控制权限和 NTFS 权限的用户。
- 请确认所有群集节点都都可以浏览到该文件共享。文件共享的路径 \ < 文件服务器 > < 共享 >。
在所有群集节点上配置 IIS 共享的配置
注意:没有与 IIS 共享服务器上配置 Windows 2008 因为缺少权限应用程序主机帮助器服务的问题。为共享配置工作,您必须执行以下步骤,Windows 2008 服务器上的 IIS 共享配置设置时。
- 打开管理的命令提示符。
- 运行以下命令:
net stop apphostsvc
- 运行以下命令:
sc privs apphostsvc SeImpersonatePrivilege/SeChangeNotifyPrivilege/SeTcbPrivilege 这一行命令,原始的中文文档有问题,我改过
- 运行以下命令:
net start apphostsvc 这一行命令,原始的中文文档有问题,我改过
完成这些步骤在群集中的每个 Windows 2008 服务器后,请在本节中继续设置 IIS 共享的配置,如所述。
在其中一个群集节点上的文件共享导出共享的配置:
- 导航到管理工具,然后单击Internet Information Services (IIS) 管理器。
- 在左窗格中,单击服务器名称节点。
- 双击共享配置图标。
- 在共享配置页中,单击导出配置导出配置文件操作窗格 (右窗格) 中从本地计算机到另一个位置。
- 在将配置导出对话框中,键入文件共享的路径 (\ < 文件服务器 > < 共享 >) 中的物理路径框。
- 单击连接,然后键入用户名和密码的用户帐户具有访问该共享的共享的配置存储,然后单击确定。此帐户将用于访问共享资源。您应使用受限的 Active Directory 帐户不是域管理员。
- 在将配置导出对话框中,键入一个密码,用以保护加密密钥,然后单击确定。
- 在共享配置页中,单击以选中启用共享的配置复选框。
- 键入物理路径、 用户帐户,以及以前,您输入的密码,然后单击操作窗格中的应用。
- 在加密密钥密码对话框中,键入加密密钥密码的更早版本,将设置,然后单击确定。
- 在共享配置对话框中,单击确定。
- 单击确定。
在每个其他群集节点,请使用您刚导出的文件共享的共享的配置:
假如你这个共享存储是同一个故障转移集群中做的,必须要将相关的资源,切换到这台机器上,才能做
- 导航到管理工具,然后单击Internet Information Services (IIS) 管理器。
- 单击服务器名称节点。
- 双击共享配置图标。
- 在共享配置页中,单击以选中启用共享的配置复选框。
- 键入该文件共享的物理路径 (\ < 文件服务器 > < 共享 >),该用户帐户,并且密码之前,输入然后在操作窗格中单击应用。
- 在加密密钥密码对话框中,键入加密密钥密码的更早版本,将设置,然后单击确定。
- 在共享配置对话框中,单击确定。
- 单击确定。
注意:有关如何设置共享配置 IIS 中的详细信息,请访问下面的 Microsoft 网站:
在所有群集节点上配置 IIS 脱机文件共享配置(似乎这一步不做也是可以的,我就没做)
在每个群集节点上,启用脱机文件:
- 安装桌面体验
- 导航到管理工具,然后单击服务器管理器。
- 在左窗格中,单击功能。
- 在右窗格中,单击添加功能。
- 单击以选中桌面体验复选框。
- 单击安装以安装桌面体验。
- 重新启动计算机。
- 在控制面板中,打开脱机文件。
- 单击启用脱机文件。不要不重新启动计算机,请稍后。
- 确保将高速缓存设置为只读。若要执行此操作,可提升的cmd窗口中运行以下命令:
REG ADD "HKLMSystemCurrentControlSetServicesCSCParameters" /v ReadOnlyCache /t REG_DWORD /d 1 /f
- 重新启动计算机。
- 从该计算机浏览到文件服务器。用鼠标右键单击包含 IIS 共享的配置中,该共享,然后单击始终脱机可用。
注意如果要将相同的故障转移群集上具有高可用性的文件共享设置时,它承载 IIS 节点,始终脱机可用选项时不会出现您,请右键单击该共享上承载高可用文件服务器所使用的群集节点。您需要移动到另一个节点的高可用文件服务器应用程序。
- 在控制面板中,打开脱机文件。单击打开同步中心,然后单击日程安排。
- 对每一天或根据要求安排在脱机文件同步。您还可以配置脱机同步运行每隔几分钟。.即使您未设置上一个计划程序,Applicationhost.config 文件中的某些内容更改时,更改将会反映在 Web 服务器上。
注意:有关如何在 IIS 中配置共享配置为脱机文件的详细信息,请访问下面的 Microsoft 网站:
配置 Web 站点 (包括关联的应用程序池),并且一个群集节点上指定其内容的位置
查找拥有群集磁盘资源的群集节点的 Web 站点的内容文件所在的位置:
- 导航到管理工具,然后单击故障转移群集管理器。
- 连接到群集。如果您是在一个群集节点上,群集将自动显示在列表中。
- 在存储下查找网页内容将驻留在其的磁盘资源。若要执行此操作,展开存储树中的磁盘资源。请确保存储未由任何其他高可用性应用程序在群集上。您会发现在可用存储下的存储。
- 注意群集节点的该资源处于联机状态。您将在该群集节点上配置 IIS。
- 注意群集磁盘资源名称。您将使用此内容的文件。
在群集节点上的资源处于联机状态,Web 服务器配置为使用 Web 站点的内容的共享的磁盘:
- 导航到管理工具,然后单击Internet Information Services (IIS) 管理器。
- 在左窗格中,展开服务器节点。
- 展开网站,然后单击站点下的正在配置的站点。
- 在右窗格中,选择管理 Web 站点下的高级设置。
- 找到的物理路径属性在常规设置,然后键入在 Web 站点的内容文件的位置的位置。这是您在前一过程的第 5 步中记下的群集磁盘资源的位置。♢其实这个群集磁盘资源,有安全方面的要求,域账号有读写权限,包括以后新建的虚拟应用程序,使用新的群集磁盘资源,也要设置域账号有读写权限。♢ 对于ASP.NET 应用程序,还要设置该域账号对C:WindowsMicrosoft.NETFramework64v2.0.50727Temporary ASP.NET Files 有读写的权限 ♢ 应用程序的物理路径凭据,也要设置为该域账号
- 单击确定。
创建故障转移群集管理器中的一个通用脚本来配置您的 Web 站点的高可用性
若要配置高可用性的 IIS Web 服务器中的最后一步,设置可用于监视的 Web 站点和网站应用程序池通用脚本资源:
- 在每个群集节点上,WindowsSystem32inetsrvClusweb7.vbs 将这篇文章的末尾此脚本。 注意这个脚本不能保存带有编码格式的
- 默认情况下,脚本监视网站名为"默认 Web 站点"和名为"默认应用程序池"应用程序池。如果这不是正确的 Web 站点和应用程序池,更改网站名称和APP_POOL_NAME变量。请确保所有群集节点上存在相同的 Web 站点和应用程序池脚本中。请注意名称区分大小写。
- 导航到管理工具,然后单击故障转移群集管理器。
- 连接到群集。如果您是在一个群集节点上,群集将自动显示在列表中。
- 用鼠标右键单击该群集,然后单击配置服务或应用程序。向导将创建高可用性的工作负荷。
- 单击通用脚本。
- 从以下路径中选择脚本文件: %systemroot%System32Inetsrvclusweb7.vbs
- 客户端将用于连接到高可用性的 Web 站点的 Web 站点名称设置的客户端访问点 (CAP) 的名称。指定静态的 Ip 用于首字下沉的网站。如果您使用的 DHCP,则将不显示此选项。
- 在选择存储步骤中,选择 Web 站点内容文件驻留在其的群集共享的磁盘。存储类型应为未使用任何其他高可用性应用程序在群集上。请注意是否用于 IIS 共享配置文件共享同一个群集上,此处应能使用不同的磁盘资源。
- 确认这些设置后,该向导将创建群集组,群集资源和资源之间的依赖关系,然后使资源联机。
注意:若要承载相同的故障转移群集上的多个高可用性的 Web 站点,请按照与上述相同的步骤。但是,为每个 Web 站点和其他群集的共享的存储使用一个不同的脚本文件。例如,%systemroot%system32inetsrv 中使用的第一个网站的第三个,第二,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>