通过第 7 层虚拟服务器,您可以选择配置负载平衡器规则并使用匹配或操作规则自定义负载平衡行为。

负载平衡器规则支持 REGEX 匹配类型。支持 PCRE 样式 REGEX 模式,但高级用例存在一些限制。在匹配条件中使用 REGEX 时,支持已命名捕获组。

REGEX 限制包括:
  • 不支持字符并集和交集。例如,不要使用 [a-z[0-9]] 和 [a-z&&[aeiou]],而要相应使用 [a-z0-9] 和 [aeiou]。
  • 仅支持 9 个向后引用,可以使用 \1 到 \9 来引用它们。
  • 请使用 \0dd 格式来匹配八进制数字,而不要使用 \ddd 格式。
  • 顶层级别不支持嵌入式标记,嵌入式标记仅在组中受支持。例如,不要使用“Case (?i:s)ensitive”,而要使用“Case ((?i:s)ensitive)”。
  • 不支持预处理操作 \l、\u、\L 和 \U。 其中 \l 是将下一字符变为小写,\u 是将下一字符变为大写,\L 将后续直至 \E 的字符变为小写,\U 则将后续直至 \E 的字符变为大写。
  • 不支持 (?(condition)X)、(?{code})、(??{Code}) 和 (?#comment)。
  • 不支持预定义的 Unicode 字符类 \X
  • 不支持对 Unicode 字符使用已命名字符构造。例如,不要使用 \N{name},而要使用 \u2018。

在匹配条件中使用 REGEX 时,支持已命名捕获组。例如,可以使用 REGEX 匹配模式 /news/(?<year>\d+)-(?<month>\d+)-(?<day>\d+)/(?<article>.*) 来匹配类似于 /news/2018-06-15/news1234.html 的 URI。

然后按如下所示设置变量:$year = "2018" $month = "06" $day = "15" $article = "news1234.html"。设置变量后,可以在负载平衡器规则操作中使用这些变量。例如,可以使用匹配的变量来重写 URI,例如 /news.py?year=$year&month=$month&day=$day&article=$article。该 URI 随后重写为 /news.py?year=2018&month=06&day=15&article=news1234.html。

重写操作可以使用已命名捕获组和内置变量的组合。例如,URI 可以重写为 /news.py?year=$year&month=$month&day=$day&article=$article&user_ip=$_remote_addr。该示例 URI 随后重写为 /news.py?year=2018&month=06&day=15&article=news1234.html&user_ip=1.1.1.1。

注: 对于已命名捕获组,名称不能以字符 _ 开头。
除了已命名捕获组之外,还可以在重写操作中使用以下内置变量。所有内置变量的名称均以 _ 开头。
  • $_args - 请求中的参数
  • $_cookie_<name> - <name> Cookie 的值
  • $_host - 按优先级顺序,请求行中的主机名,或者“Host”请求标头字段中的主机名或与请求匹配的服务器名称
  • $_hostname - 主机名
  • $_http_<name> - 任意请求标头字段,<name> 是字段名称,该字段名称将转换为小写,并且其中的短划线将替换为下划线
  • $_https - 如果连接在 SSL 模式下工作,为 "on";否则为 ""
  • $_is_args - 如果请求行包含参数,为 "?";否则为 ""
  • $_query_string - 与 $_args 相同
  • $_remote_addr - 客户端地址
  • $_remote_port - 客户端端口
  • $_request_uri - 完整的原始请求 URI(包含参数)
  • $_scheme - 请求方案“http”或“https”
  • $_server_addr - 接受请求的服务器的地址
  • $_server_name - 接受请求的服务器的名称
  • $_server_port - 接受请求的服务器的端口
  • $_server_protocol - 请求协议,通常为“HTTP/1.0”或“HTTP/1.1”
  • $_ssl_client_cert - 为已建立的 SSL 连接返回 PEM 格式的客户端证书,证书中除第一行以外的每一行开头均附加制表符字符
  • $_ssl_server_name - 通过 SNI 返回请求的服务器名称
  • $_uri - 请求中的 URI 路径

前提条件

确认第 7 层虚拟服务器可用。请参见配置第 7 层虚拟服务器

过程

  1. 打开第 7 层虚拟服务器。
  2. 跳至“虚拟服务器标识符”页面。
  3. 输入虚拟服务器 IP 地址和端口号。
    您可以输入虚拟服务器的端口号或端口范围。
  4. 填写高级属性详细信息。
    选项 说明
    最大并发连接 设置允许与虚拟服务器建立的最大并发连接,这样虚拟服务器就不会耗尽托管在同一负载平衡器上的其他应用程序的资源。
    最大新连接速率 设置与服务器池成员的最大新连接,这样虚拟服务器就不会耗尽资源。
    默认池成员端口 如果未定义虚拟服务器的池成员端口,请输入默认池成员端口。

    例如,如果虚拟服务器的端口范围定义为 2000-2999,默认池成员端口范围设置为 8000-8999,则到虚拟服务器端口 2500 的传入客户端连接将被发送到目标端口设置为 8500 的池成员。

  5. (可选) 从下拉菜单中选择现有默认服务器池。
    服务器池包含一个或多个配置类似并运行相同应用程序的服务器(称为池成员)。
  6. 单击添加以配置 HTTP 请求重写阶段的负载平衡器规则。
    支持的匹配类型是 REGEX、STARTS_WITH、ENDS_WITH 等,以及逆反选项。
    支持的匹配条件 说明
    HTTP 请求方法 与 HTTP 请求方法匹配。

    http_request.method - 要匹配的值

    HTTP 请求 URI 与不带查询参数的 HTTP 请求 URI 匹配。

    http_request.uri - 要匹配的值

    HTTP 请求 URI 参数 与 HTTP 请求 URI 查询参数匹配。

    http_request.uri_arguments - 要匹配的值

    HTTP 请求版本 与 HTTP 请求版本匹配。

    http_request.version - 要匹配的值

    HTTP 请求标头 与任何 HTTP 请求标头匹配。

    http_request.header_name - 要匹配的标头名称

    http_request.header_value - 要匹配的值

    HTTP 请求负载 与 HTTP 请求正文内容匹配。

    http_request.body_value - 要匹配的值

    TCP 标头字段 与 TCP 源或目标端口匹配。

    tcp_header.source_port - 要匹配的源端口

    tcp_header.destination_port - 要匹配的目标端口

    IP 标头字段 与 IP 源或目标地址匹配。

    ip_header.source_address - 要匹配的源地址

    ip_header.destination_address - 要匹配的目标地址

    操作 说明
    HTTP 请求 URI 重写 修改 URI。

    http_request.uri - 要写入的 URI(不含查询参数)

    http_request.uri_args - 要写入的 URI 查询参数

    HTTP 请求标头重写 修改 HTTP 标头的值。

    http_request.header_name - 标头名称

    http_request.header_value - 要写入的值

  7. 单击添加以配置 HTTP 请求转发的负载平衡器规则。
    所有匹配值接受正则表达式。
    支持的匹配条件 说明
    HTTP 请求方法 与 HTTP 请求方法匹配。

    http_request.method - 要匹配的值

    HTTP 请求 URI 与 HTTP 请求 URI 匹配。

    http_request.uri - 要匹配的值

    HTTP 请求 URI 参数 与 HTTP 请求 URI 查询参数匹配。

    http_request.uri_args - 要匹配的值

    HTTP 请求版本

    与 HTTP 请求版本匹配。

    http_request.version - 要匹配的值

    HTTP 请求标头

    与任何 HTTP 请求标头匹配。

    http_request.header_name - 要匹配的标头名称

    http_request.header_value - 要匹配的值

    HTTP 请求负载

    与 HTTP 请求正文内容匹配。

    http_request.body_value - 要匹配的值

    TCP 标头字段

    与 TCP 源或目标端口匹配。

    tcp_header.source_port - 要匹配的源端口

    tcp_header.destination_port - 要匹配的目标端口

    IP 标头字段

    与 IP 源地址匹配。

    ip_header.source_address - 要匹配的源地址

    操作 说明
    拒绝 拒绝请求,例如,通过将状态设置为 5xx。

    http_forward.reply_status - 用于拒绝的 HTTP 状态代码

    http_forward.reply_message - HTTP 拒绝消息

    重定向 重定向请求。状态代码必须设置为 3xx。

    http_forward.redirect_status - 用于重定向的 HTTP 状态代码

    http_forward.redirect_url - HTTP 重定向 URL

    选择池

    将请求强制到特定服务器池。指定池成员的配置算法(预测器)用于在服务器池中选择服务器。

    http_forward.select_pool - 服务器池 UUID

  8. 单击添加以配置 HTTP 响应重写的负载平衡器规则。
    所有匹配值接受正则表达式。
    支持的匹配条件 说明
    HTTP 响应标头 与任何 HTTP 响应标头匹配。

    http_response.header_name - 要匹配的标头名称

    http_response.header_value - 要匹配的值

    操作 说明
    HTTP 响应标头重写 修改 HTTP 响应标头的值。

    http_response.header_name - 标头名称

    http_response.header_value - 要写入的值

  9. (可选) 单击下一步以配置负载平衡配置文件。
  10. 单击完成