我需要为许多类似的环境设置配置。每个都有不同的主机名,遵循某种模式,例如 env1、env2 等。
我可以为每个环境使用一个池和一个带有 irule 的单个虚拟服务器,该 irule 根据主机名选择一个池。
我更喜欢做的是根据请求的主机名动态生成和选择池名称,而不是在 switch 语句中列出每个池。它更易于维护和自动处理新环境。
代码可能如下所示:
when HTTP_REQUEST {
pool [string tolower [HTTP:host]]
}
并且每个池名称都与主机名匹配。
这可能吗?或者有没有更好的方法?
编辑
我已经扩展了我的主机名池选择。我现在正在尝试包含端口号。新规则如下所示:
when HTTP_REQUEST {
set lb_port "[LB::server port]"
set hostname "[string tolower [getfield [HTTP::host] : 1]]"
log local0.info "Pool name $hostname-$lb_port-pool"
pool "$hostname-$lb_port-pool"
}
这是有效的,但我在日志中看到 no-such-pool 错误,因为端口 0 请求以某种方式进入池中。它似乎是第一个请求,然后是具有合法端口的请求。
Wed Feb 17 20:39:14 EST 2016 info tmm tmm[6519] Rule /Common/one-auto-pool-select-by-hostname-port <HTTP_REQUEST>: Pool name my.example.com-80-pool
Wed Feb 17 20:39:14 EST 2016 err tmm1 tmm[6519] 01220001 TCL error: /Common/one-auto-pool-select-by-hostname-port <HTTP_REQUEST> - no such pool: my.example.com-0-pool (line 1) invoked from within "pool "$hostname-$lb_port-pool""
Wed Feb 17 20:39:14 EST 2016 info tmm1 tmm[6519] Rule /Common/one-auto-pool-select-by-hostname-port <HTTP_REQUEST>: Pool name my.example.com-0-pool
是什么导致端口 0 请求?有什么解决方法吗?例如,我可以测试端口 0 并选择默认端口或忽略它吗?
再编辑一次
重建虚拟服务器,现在错误消失了。VS的重建只是重命名它。我很确定我重新创建了完全相同的设置。