使用应用程序请求路由实现 HTTP 负载均衡

作者:IIS 团队

概述

本主题引导读者完成配置应用程序请求路由以对 HTTP 请求进行负载均衡的步骤,从而实现高可用性和可伸缩性。 本演练还重点介绍了有关应用程序请求路由如何监视内容服务器的运行状况以及将客户端发出的请求关联到内容服务器的几个核心功能。

目标

使用应用程序请求路由在多个内容服务器之间对 HTTP 请求进行负载均衡,如下所示:

跨多个内容服务器的应用程序请求路由示意图。

先决条件

本演练要求满足以下先决条件:

  • IIS 7.0 或更高版本(在 Windows 2008(任何 SKU)或更高版本上)。
  • Microsoft 应用程序请求路由版本 1 和依赖模块。
  • 至少有两个包含工作站点和应用程序的内容服务器。

按照文档中概述的步骤安装应用程序请求路由。

另一个先决条件是,读者已使用定义和配置应用程序请求路由 (ARR) 服务器组中所述的步骤定义和配置了服务器场

步骤 1 - 验证 URL 重写规则

如果已使用定义和配置应用程序请求路由 (ARR) 服务器组中概述的步骤创建服务器场,则已为简单的负载均衡方案创建了 URL 重写规则

使用 UI 验证 URL 重写规则:

  1. 启动 IIS 管理器。
  2. 选择在定义和配置应用程序请求路由 (ARR) 服务器组中创建的服务器场 myServerFarm
  3. 将显示以下图标:
    服务器场的屏幕截图。运行状况测试图标、负载均衡图标、监视和管理图标、代理图标、路由规则图标和服务器相关性图标。
  4. 双击“路由规则”
  5. 验证是否已选中“使用 URL 重写检查传入请求”复选框
    “路由规则”页的屏幕截图。使用 U R L 重写检查传入请求旁边的检查框,同时检查启用 S S L 卸载。
  6. 默认启用 SSL 卸载。 启用此功能后,ARR 服务器和应用程序服务器之间的所有通信都以明文形式完成,即使对从客户端到 ARR 服务器的 HTTPS 请求也是如此。 当 ARR 服务器和应用程序服务器都部署在受信任的网络内(例如同一数据中心内)时,启用 SSL 卸载不会牺牲安全性。 此外,启用此功能还可以进一步帮助最大限度地利用应用程序服务器上的服务器资源,因为它们不需要花数个周期来对请求和响应进行加密和解密。
    若要禁用 SSL 卸载,请取消选中“启用 SSL 卸载”复选框,然后单击“应用”
  7. 打开浏览器并向 ARR 服务器发送多个请求。
  8. 若要验证请求是否在应用程序服务器之间均衡负载,请选择“myServerFarm”。 双击“监视和管理”
    服务器场的屏幕截图。“监视和管理”图标在其他图标中显示。
  9. 在仪表板视图中,验证请求是否均匀分布。
    “监视和管理功能”页的屏幕截图。将显示应用程序请求路由的运行时统计信息。

使用命令行验证 URL 重写规则:

  1. 使用管理员特权打开命令提示符

  2. 导航到 %windir%\system32\inetsrv

  3. 若要验证是否已正确创建 URL 重写规则,请输入 appcmd.exe list config -section:system.webServer/rewrite/globalRules。 将返回如下所示的 globalRules:

    <system.webServer>
        <rewrite>
            <globalRules>
                <rule name="ARR_myServerFarm_loadbalance" patternSyntax="Wildcard"
                stopProcessing="true">
                    <match url="*" />
                    <conditions>
                    </conditions>
                    <action type="Rewrite" url="http://myServerFarm/{R:0}" />
                </rule>
            </globalRules>
        </rewrite>
    </system.webServer>
    
  4. 若要禁用 SSL 卸载,请先删除所有 URL 重写规则:

    appcmd.exe clear config -section:system.webServer/rewrite/globalRules
    

    然后,创建 URL 重写规则,转发 HTTPS 流量。 更具体而言,根据此规则,如果传入请求是 HTTPS,则 ARR 会使用 SSL 转发请求:

    appcmd.exe set config -section:system.webServer/rewrite/globalRules
    /+"[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True']"
    /commit:apphost
    
    appcmd.exe set config -section:system.webServer/rewrite/globalRules
    /[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].match.url:"*"
    /commit:apphost
    
    appcmd.exe set config -section:system.webServer/rewrite/globalRules
    /+"[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].conditions.[input='{HTTPS}',pattern='On']"
    /commit:apphost
    
    appcmd.exe set config -section:system.webServer/rewrite/globalRules
    /[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].action.type:"Rewrite"
    /[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].action.url:"https://myServerFarm/{R:0}"
    /commit:apphost
    

    最后,创建 URL 重写规则,以明文形式将 HTTP 流量转发到应用程序服务器:

    appcmd.exe set config -section:system.webServer/rewrite/globalRules
    /+"[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True']"
    /commit:apphost
    
    appcmd.exe set config -section:system.webServer/rewrite/globalRules
    /[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True'].match.url:"*"
    /commit:apphost
    
    appcmd.exe set config -section:system.webServer/rewrite/globalRules
    /[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True'].action.type:"Rewrite"
    /[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True'].action.url:"http://myServerFarm/{R:0}"
    /commit:apphost
    
  5. 若要验证是否已在禁用 SSL 卸载的情况下正确创建 URL 重写规则,请输入 appcmd.exe list config -section:system.webServer/rewrite/globalRules。 将返回如下所示的 globalRules:

    <system.webServer>
        <rewrite>
            <globalRules>
                <rule name="ARR_myServerFarm_loadbalance_SSL" patternSyntax="Wildcard"
                stopProcessing="true">
                    <match url="*" />
                    <conditions>
                    <add input="{HTTPS}" pattern="On" />
                    </conditions>
                    <action type="Rewrite" url="https://myServerFarm/{R:0}" />
                </rule>
                <rule name="ARR_myServerFarm_loadbalance" patternSyntax="Wildcard"
                stopProcessing="true">
                    <match url="*" />
                    <conditions>
                    </conditions>
                    <action type="Rewrite" url="http://myServerFarm/{R:0}" />
                </rule>
            </globalRules>
        </rewrite>
    </system.webServer>
    

步骤 2 - 配置运行状况检查监视

应用程序请求路由通过两种方式监视内容服务器的运行状况:

  • 通过实时流量
  • 通过显式 URL 测试

默认情况下,当向应用程序请求路由发出请求时,会自动执行实时流量测试。 显式 URL 测试是可与实时流量测试配合使用的附加测试。 在本部分中,演练将指导你配置显式 URL 测试。

使用 UI 配置运行状况检查监视:

  1. URL 测试需要使用特定 URL 进行测试。 若要满足此要求,请使用记事本创建一个名为 healthCheck.txt 的文本文件,其中包含语句“I amhealthy.”
  2. 将 healthCheck.txt 文件置于应用程序服务器上
  3. 通过在浏览器中打开页面来验证 healthCheck.txt 是否正确呈现
  4. 在 IIS 管理器中,选择服务器场 myServerFarm。 将显示以下图标:
    服务器场的屏幕截图。“运行状况测试”图标、“负载均衡”图标、“监视和管理”图标和其他图标。
  5. 双击“运行状况测试”
    运行状况测试功能页的屏幕截图。显示 U R L 测试。
  6. 输入 http://(server name or FQDN of ARR server)/healthCheck.txt 作为“URL”值
  7. 输入 healthy 作为“响应匹配”值。 “响应匹配”是一项可选测试,用于确保响应正文包含预期的字符串。 在本例中,由于 healthCheck.txt 包含语句“I amhealthy.”,因此“响应匹配”将查找单词“healthy”
  8. 单击“应用”保存所做的更改。
  9. 若要验证运行状况检查监视的功能,请停止其中一个应用程序服务器上的受监视站点。 由于“间隔(秒)”值设置为 30 秒,因此请等待 30 秒进行下一次运行状况检查
  10. 等待 30 秒后,向 ARR 服务器发送多个请求。
  11. 若要验证所有请求是否都发送到运行状况良好的服务器,请双击“监视和管理”,然后使用 F5 键刷新仪表板。 请注意,运行时统计信息已重置。 这是设计的结果。 可能需要根据需要发送其他请求并刷新仪表板。
    “监视和管理功能”页的屏幕截图。将显示运行时统计信息。
  12. 运行状况监视还用于检测运行不正常的服务器何时恢复正常。 若要验证此功能,请启动在步骤 9 中停止的站点。 同样,由于“间隔(秒)”值设置为 30 秒,因此请等待 30 秒进行下一次运行状况检查
  13. 等待 30 秒后,向 ARR 服务器发送多个请求。
  14. 若要验证请求是否在服务器之间均匀分布,请刷新 IIS 管理器中的仪表板。 请注意,运行时统计信息已重置。 这是设计的结果。 可能需要根据需要发送其他请求并刷新仪表板。

使用命令行配置运行状况检查监视:

  1. 使用管理员特权打开命令提示符

  2. 导航到 %windir%\system32\inetsrv

  3. 若要将 URL 设置为 http://(server name or FQDN of ARR server)/healthCheck.txt,并使用“I amhealth.”作为要匹配的字符串,请输入

    appcmd.exe set config -section:webFarms
    /[name='myServerFarm1'].applicationRequestRouting.healthCheck.url:"http://(server
    name or FQDN of ARR server)/healthCheck.txt "
    /[name='myServerFarm1'].applicationRequestRouting.healthCheck.responseMatch:"I am
    healthy." /commit:apphost
    

步骤 3 - 配置客户端相关性

应用程序请求路由提供了客户端相关性功能,可在客户端会话期间将客户端映射到应用程序请求路由后的内容服务器。 启用此功能后,负载均衡算法仅应用于来自客户端的第一个请求。 从该时间点起,在客户端会话期间,来自同一客户端的所有后续请求都将路由到同一内容服务器。 如果内容服务器上的应用程序是有状态的,并且如果由于会话管理不是集中式的,客户端的请求必须路由到同一内容服务器,则此功能非常有用。

使用 UI 配置客户端相关性:

  1. 启动 IIS 管理器。
  2. 选择在定义和配置应用程序请求路由 (ARR) 服务器组中创建的服务器场 myServerFarm
  3. 将显示以下图标:
    在服务器组中找到的“服务器场”对话框和图标的屏幕截图。
  4. 双击“服务器相关性”
  5. 若要启用客户端相关性,请选中“客户端相关性”复选框,然后单击“应用”
    “服务器相关性”功能页的屏幕截图。显示客户端相关性旁边的检查框。在 Cookie 名称框中,将显示文本 A R R 相关性。
    应用程序请求路由使用 Cookie 来启用客户端相关性。 “Cookie 名称”将用于在客户端上设置 Cookie。 也就是说,客户端必须接受 Cookie 才能使客户端相关性正常工作。
  6. 若要验证客户端相关性的功能,请向 ARR 服务器发送多个请求。 刷新 IIS 管理器中的仪表板(监视和管理)。 验证运行时统计信息是否仅针对与客户端关联的应用程序服务器之一发生更改。 可能需要根据需要发送其他请求并刷新仪表板。

使用命令行配置客户端相关性:

  1. 使用管理员特权打开命令提示符

  2. 导航到 %windir%\system32\inetsrv

  3. 若要启用客户端相关性,请输入:

    appcmd.exe set config -section:webFarms
    /[name='myServerFarm1'].applicationRequestRouting.affinity.useCookie:"True"
    /commit:apphost
    

步骤 4 - 禁止新连接

禁止服务器上的新连接是将服务器移出服务器场环境的一种正常方法。 当使用客户端相关性功能时,它更有意义,因为应用程序请求路由在不允许新连接时将遵循现有会话。 也就是说,当客户端关联到不允许新连接的服务器时,客户端将继续路由到同一服务器,因此不会对客户端造成任何影响。 但是,不会将任何新客户端路由到不允许新连接的服务器。

使用 UI 禁止新连接:

  1. 使用上述步骤 3 中的设置,确定客户端关联到的服务器。
  2. 选择在定义和配置应用程序请求路由 (ARR) 服务器组中创建的服务器场 myServerFarm
  3. 将显示以下图标:
    服务器场的屏幕截图。运行状况测试图标、负载均衡图标、监视和管理图标、代理图标以及服务器场中找到的其他图标。
  4. 双击“监视和管理”
  5. 选择客户端关联到的服务器。 在“操作”窗格中,单击“禁止新连接”
  6. 在确认对话框中,单击“是”
    “应用程序请求路由”对话框的屏幕截图。文本是否确实要禁止与所选服务器建立新连接?显示。突出显示了“是”选项。
  7. 若要验证来自客户端的请求是否继续路由到关联服务器(该服务器现在禁止新连接),请向 ARR 服务器发送多个请求。 刷新 IIS 管理器中的仪表板。 验证运行时统计信息是否仅针对与客户端关联的服务器发生更改。 可能需要根据需要发送其他请求并刷新仪表板。
  8. 若要验证新客户端是否未路由到禁止新连接的服务器,请关闭并重启浏览器,删除应用程序请求路由设置的 Cookie。
  9. 向 ARR 服务器发送多个请求。 刷新 IIS 管理器中的仪表板。 验证运行时统计信息是否仅针对可用的服务器发生更改。 更具体而言,验证不允许新连接的服务器的运行时统计数据是否更改。 可能需要根据需要发送其他请求并刷新仪表板。

总结

现在,已成功为应用程序请求路由配置多个设置,以便横向扩展和均匀分配负载。 有关使用应用程序请求路由的更高级路由功能,请参阅使用应用程序请求路由