通过第 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 - 请求中的参数
- $_arg_<name> - 请求行中的参数 <name>
- $_cookie_<name> - <name> Cookie 的值
- $_upstream_cookie_<name> - 由“Set-Cookie”响应标头字段中的上游服务器发送的具有指定名称的 Cookie
- $_upstream_http_<name> - 任意响应标头字段,<name> 是字段名称,该字段名称将转换为小写,并且其中的短划线将替换为下划线
- $_host - 按优先级顺序,请求行中的主机名,或者“Host”请求标头字段中的主机名或与请求匹配的服务器名称
- $_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 路径
- $_ssl_ciphers:返回客户端 SSL 密码
- $_ssl_client_i_dn:根据 RFC 2253 返回建立的 SSL 连接的客户端证书的“颁发者 DN”字符串
- $_ssl_client_s_dn:根据 RFC 2253 返回建立的 SSL 连接的客户端证书的“主体 DN”字符串
- $_ssl_protocol:返回建立的 SSL 连接的协议
- $_ssl_session_reused:如果重用 SSL 会话,则返回“r”,否则,返回“.”
前提条件
确认第 7 层虚拟服务器可用。请参见在管理器模式下配置第 7 层虚拟服务器。