配置第 7 层内容切换

Last published : Oct 06, 2026
NetScaler 应用交付管理 (ADM) 与 OpenStack 协同工作,在 NetScaler 实例上配置第 7 层 (L7) 切换或基于内容切换的功能。内容切换与简单的负载均衡不同之处在于,特定类型的请求可以被定向到特定的服务器。当在 OpenStack 中以 NetScaler 实例作为提供者创建 L7 配置时,NetScaler ADM 会分配一个 NetScaler 实例,并部署与 L7 配置相对应的内容切换和响应器配置。然后,NetScaler 实例可以根据请求的应用层特性分发和负载均衡用户请求。
OpenStack 第 7 层 (L7) 负载均衡功能结合了负载均衡和内容切换,以提供特定类型内容的优化交付。这通过仅运行适用于内容的策略来提高负载均衡器的性能。第 7 层负载均衡还有助于提高应用程序基础设施的效率。根据类型、URI 或数据分离内容的能力,可以更好地分配应用程序基础设施中的物理资源。例如,浏览到 http://example-sports.com/about-us 的最终用户由托管公司和服务的相关内容的服务器池提供服务,而浏览到 http://example-sports.com/shopping-cart-football 的用户则由另一个服务器池提供服务,该服务器池允许用户进行在线购买。
在 L7 切换中,负载均衡器实现为内容切换虚拟服务器,它接受来自用户的 HTTP 请求并将这些请求分发到应用程序服务器。L7 切换或内容切换允许您拥有一个单点入口来访问各种后端服务(例如,不仅是 Web 应用程序、Web 服务门户、Web 邮件,还包括移动管理、不同语言的内容等)。也就是说,您可以为向用户提供的所有服务提供一个公共 IP 地址。
与低层负载均衡不同,第 7 层切换不要求池中的所有服务器都具有相同的内容。使用 L7 切换的负载均衡器配置期望来自不同池的应用程序或后端服务器具有不同的内容。L7 交换机可以根据 URI、主机、HTTP 标头或应用程序消息中的任何其他内容来定向请求。应用程序服务器本质上是提供特定类型的内容。例如,一个服务器只能提供图像,另一个可能运行服务器端脚本语言(如 PHP 和 ASP),而另一个可以提供静态内容(如 HTML、CSS 和 JavaScript)。

L7 规则

以下属性在规则中定义,用于评估流量,并与规则中定义的值进行比较:
  • 主机名:HTTP 请求中的主机名与规则中的值参数进行比较。例如,“www.example-sports.com.”
  • 路径:HTTP URI 的路径部分与规则中的值参数进行比较。例如,“www.example-sports.com/shopping-cart/football_pump.html”
  • file\_type: URI 的最后一部分与规则中的值参数进行比较。例如,txt、html、jpg、PNG、xls 等。
  • 标头:键参数中定义的标头与规则中的值参数进行比较。
  • Cookie:由键参数命名的 Cookie 与规则中的值参数进行比较。Cookie 请求头字段值包含为该 URL 存储的名称和值对信息;通用语法如下 - Cookie: name=value。例如,查找名为“stores”且值以“football-”开头的 Cookie 的规则将如下所示:type = Cookie, compare_type=StartsWith, key = stores value = football-。

比较类型

在评估流量时,L7 策略会将以下表达式与规则中定义的属性进行比较。
  • 正则表达式:Perl 类型正则表达式匹配
  • starts\_with: 字符串开头是
  • ends\_with: 字符串结尾是
  • contains: 字符串包含
  • equal\_to: 字符串等于
注意
主机名、路径、标头和 Cookie 属性支持所有比较类型,但 file\_type 属性仅支持 regex 和 equal\_to。

L7 策略

L7 策略处理传入的 HTTP 流量,并在策略中定义的所有规则都匹配时返回“true”值。
在任何 L7 策略中,所有规则都通过 AND 运算符进行逻辑连接。请求必须匹配所有规则,策略才能返回“true”值。负载均衡器采取的操作基于策略返回的值。您可以创建具有相同操作的第二个策略,以实现规则之间的逻辑 OR 操作。
例如,您可以创建一个策略,其中传入的 HTTP 请求可以包含“EXAMPLE-SPORTS”、“SPORTS-FOOTBALL”或“EXAMPLE-FOOTBALL”等词,以便负载均衡器采取适当的操作,将这些请求转发到 Example-sports 电子商务公司的服务器池,以提供请求的内容。您可以创建另一个策略,该策略执行相同的操作,但匹配“example-sports”、“example-sports-football”或“example-football”。当用户发送包含这六个关键字中任何一个的 HTTP 请求时,负载均衡器会将请求转发到 Example-Sports 服务器。
根据策略中定义的规则,L7 策略可以执行以下任何操作:
  • 重定向到池 - 将请求转发到由与 L7 策略关联的规则标识的应用程序服务器池。也就是说,您可以创建一个应用程序规则,根据域名将请求定向到特定的负载均衡器池。例如,您可以创建一个规则,将一些请求定向到 example-football.com 到 pool\_1,将其他请求定向到 example-sports-online\_purchase.com 到 pool\_2。
  • 重定向到 URL - 向客户端发送一个重定向 HTTP 响应,其中位置响应头包含新位置。浏览器将使用新位置更新地址栏并发出新请求。用例有很多。例如,如果网站地址已更改,您可以将请求重定向到新地址而不是丢弃。或者,在网站维护期间,您可以将用户重定向到只读站点。
  • 拒绝 - 拒绝请求,不采取进一步行动。例如,您可以返回 401 未授权响应,以拒绝用户访问受限网页。
内容切换配置包括内容切换虚拟服务器、由负载均衡虚拟服务器和服务组成的负载均衡设置以及内容切换策略。创建内容切换虚拟服务器和策略后,将每个策略绑定到内容切换虚拟服务器。将策略绑定到内容切换虚拟服务器时,需要指定目标负载均衡虚拟服务器。当请求到达内容切换虚拟服务器时,虚拟服务器会将关联的内容切换策略应用于该请求。策略的优先级定义了绑定到内容切换虚拟服务器的策略的评估顺序。
任何具有监听器 ID 的池都可以被指定为虚拟服务器的默认池,流量将分流到该池。该池与监听器松散绑定,并且仅通过实施 L7 策略才能与监听器关联。池也可以直接在负载均衡器下创建,而不必与监听器绑定。在这种情况下,池将处于“pending\_create”状态。由于 L7 策略与监听器紧密绑定,因此必须创建并实施包含池 ID 的 L7 策略,才能使池变为“active”并开始接收流量请求。
一个池可以由多个 L7 策略提供服务,但只要至少有一个策略附加到它,它就保持“active”状态。当最后一个策略被移除时,池将返回到“pending\_create”状态,直到创建并关联另一个策略。如果池本身被移除,所有原本应由它接收的 HTTP 请求都将被重定向到默认池。

OpenStack L7 策略与 NetScaler 实体之间的映射

OpenStack NetScaler 实体 描述
操作为 REDIRECT_TO_POOL 的 L7 策略 内容切换策略 > 内容切换操作 NetScaler ADM 创建一个内容切换策略,该策略绑定到内容切换虚拟服务器,并与一个内容切换操作相关联,该操作指定用于内容检索和向用户呈现的应用程序服务器的目标池。
操作为 REDIRECT_TO_URL 的 L7 策略 响应器策略 > 响应器操作 NetScaler ADM 创建一个响应器策略,该策略绑定到内容切换虚拟服务器,并与一个响应器操作相关联,该操作指定要呈现给用户的目标 URL。
操作为 REJECT 的 L7 策略 响应器策略 > 丢弃请求 NetScaler ADM 创建一个响应器策略,该策略绑定到内容切换虚拟服务器,并与一个丢弃请求的响应器操作相关联。
如果评估结果为“true”的 L7 策略操作将流量重定向到处于“create\_pending”状态的池,NetScaler ADM 将实施指定的池以及负载平衡虚拟服务器。NetScaler ADM 从 L7 策略创建内容切换策略,并使用相应的内容切换操作将请求重定向到与该池关联的负载平衡虚拟服务器。如果第二个 L7 策略重定向到同一个池,NetScaler ADM 将创建内容切换策略和内容切换操作,以将流量重定向到与该池关联的现有负载平衡虚拟服务器。

策略定位

OpenStack 中 L7 策略的评估由其优先级决定。在 OpenStack 中,默认情况下,策略按照创建顺序分配优先级。首先创建的策略编号为“1”,随后创建的策略按顺序编号。但您可以更改策略的优先级并为其分配不同的优先级。策略始终按照其优先级的顺序进行评估。第一个匹配特定请求的策略始终首先运行。
创建策略时,请注意以下几点:
  • 如果您为新策略分配与现有策略相同的优先级,则新策略将获得该优先级。现有策略的优先级将降低。如有必要,其他策略的优先级也会降低,以保持策略的评估顺序。
  • 如果您在未指定位置的情况下创建新策略,则新策略将直接附加到列表中。
  • 如果您创建新策略并为其分配一个大于列表中现有策略数量的位置,则新策略将附加到列表中,也就是说,新策略始终采用下一个可用的优先级。例如,如果存在优先级分别为 1、2 和 3 的三个策略 A、B 和 C,并且您创建了一个策略并分配了优先级 8,则新策略的优先级将变为 4。
  • 如果您向列表中添加策略或从列表中删除策略,则策略位置值将从 1 开始重新排序,不跳过任何数字。例如,如果策略 A、B、C 和 D 的位置值分别为 1、2、3 和 4,并且您从列表中删除了策略 B,则策略 C 现在将占据第二个位置,策略 D 将占据第三个位置。
在 NetScaler ADM 中,始终存在一个与 csvserver 关联的默认策略,其优先级为 1。此默认策略指定 lbvserver 在任何给定时间点处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应器策略和内容切换策略时,它们的优先级始终比相应的 L7 策略的优先级高 1。例如,当评估优先级为 1 的 L7 策略时,将创建优先级为 2 的内容切换策略。同样,当评估优先级为 2 的 L7 策略时,将创建优先级为 3 的响应器策略。
在 OpenStack 中,首先评估“reject”或“redirect\_to\_url”策略,然后评估“redirect\_to\_pool”策略。在 NetScaler 实例中,响应器策略始终首先评估,以丢弃请求或向用户显示重定向的 Web 地址,而内容切换策略最后评估。如果内容切换策略和响应器策略是互斥的,则这种评估顺序通常不会引起任何冲突。也就是说,两个 L7 策略不能具有相同的表达式。在响应器和内容切换策略中添加派生表达式以避免此类冲突。例如,编写一个表达式以拒绝所有对“sports-football.com”的请求,并编写另一个表达式以允许对“example-sports-football.com”的请求。创建 L7 策略,以便所有拒绝请求的响应器策略都排列在评估列表的顶部,然后是用于 Web 直接的响应器策略,最后是内容切换策略。
在 NetScaler ADM 中,始终存在一个与 csvserver 关联的默认策略,其优先级为 1。此默认策略指定 lbvserver 在任何给定时间点处理的 TCP 连接数。因此,当在 NetScaler 中创建相应的响应器策略和内容切换策略时,它们的优先级始终比相应的 L7 策略的优先级高 1。例如,当评估优先级为 1 的 L7 策略时,将创建优先级为 2 的内容切换策略。同样,当评估优先级为 2 的 L7 策略时,将创建优先级为 3 的响应器策略。
在 OpenStack 中,首先评估“reject”或“redirect\_to\_url”策略,然后评估“redirect\_to\_pool”策略。在 NetScaler 中,响应器策略始终首先评估,以丢弃请求或向用户显示重定向的 Web 地址,而内容切换策略最后评估。如果内容切换策略和响应器策略是互斥的,则这种评估顺序通常不会引起任何冲突。也就是说,没有两个 L7 策略具有相似的表达式。在响应器和内容切换策略中添加相似的派生表达式以避免此类冲突。例如,编写一个表达式以拒绝所有对“sports-football.com”的请求,并编写另一个表达式以允许对“example-sports-football.com”的请求。创建 L7 策略,以便所有拒绝请求的响应器策略都排列在评估列表的顶部,然后是用于 Web 直接的响应器策略,最后是内容切换策略。

配置任务

L7 策略和操作的实施通过 Neutron LBaaS 命令执行。
在 OpenStack 中设置环境变量并创建负载平衡器(例如,LB1)。成功创建负载平衡器后,创建侦听器和池(例如,L1、P1 和 P2),并向池中添加成员和监视器。例如,P1 是 L1 的默认池,而 P2 是与 LB1 绑定并管理应用程序服务器的池。
有关如何使用命令行配置 LBaaS V2 的更多信息,请参阅使用命令行配置 LBaaS V2。
以下命令创建策略并定义特定操作:

创建 L7 策略以丢弃请求

neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action<action-name>
示例:
neutron lbaas-l7policy-create --name policy11 --action REJECT --listener L1
上述命令创建并将响应器策略 policy11 绑定到内容切换服务器以拒绝请求。由于未为此策略创建任何规则,因此该策略评估为“false”,并且请求被拒绝。

创建 L7 策略以将请求重定向到特定 URL

neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action <action-name> --redirect-url <redirect-url>
示例:
neutron lbaas-l7policy-create --name policy12 --action REDIRECT\_TO\_URL --listener admin-list1 --redirect-url http://example-sports/about-us.html
上述命令创建了一个响应器操作以将请求重定向到 URL,创建了一个带操作的响应器策略,并将此策略绑定到内容切换虚拟服务器。
neutron lbaas-l7rule-create --type HOST_NAME --compare-type CONTAINS --value <value-string> <L7 policy name>

neutron lbaas-l7rule-create --type PATH --compare-type CONTAINS --value <value-string> <L7 policy name>
上述两条规则可以使用 AND 运算符连接起来,以导出响应器策略的表达式。

创建 L7 策略以将请求重定向到池

neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action <action-name> --redirect-pool <redirect-pool>
示例:
neutron lbaas-l7policy-create --name policy13 --action REDIRECT\_TO\_POOL --listener admin-list1 --redirect-pool admin-pool2
如果这是第一个 L7 策略,则上述命令将 P2 与 LB1 一起实施,创建内容切换重定向操作并将请求重定向到 LB1。如果 P2 已存在,则该命令将创建内容切换重定向操作并将请求重定向到 LB1。