1.背景描述
1.1问题描述
客户F5是7层负载,F5下面有两台Nginx服务器,真实服务器位于Nginx之后,客户说Nginx只接受域名的访问连接,现要实现对于uri包含 /ABC 的链接负载到Nginx 服务器对应的pool,其他链接负载到默认pool。
1.2拓扑
2.解决方法
2.1基于域名的VS访问
基于域名的VS访问,也就是vs地址为DNS服务器上将需要访问的域名对应的A记录,并编写一个irules,以实现如果uri 包含/ABC ,将其指定到Nginx 对应的pool(irule可参考2.2)。这样当客户端访问对应域名的时候,会解析成相应的VS地址去访问,VS通过 irulrs选择pool 里某一台Nginx 服务器,与其建立连接并转发客户端请求,get请求的host为访问时的域名。
注意:F5的行为取决于客户端,客户端发起域名请求,所以F5转发客户端请求到Nginx,也是基于域名的。
2.2基于irules的访问
此种方式不用修改DNS服务器配置,具体实现方法为:编写一个irules,用来实现当 uri 包含 /ABC 时,将http header用域名代替,并且将其指定到Nginx 对应的pool,对于其他请求则指定默认 pool。当客户端请求命中VS,VS上挂载的irules生效,当F5与Nginx服务器建立TCP连接后,转发该域名的get请求。
irules如下:
when HTTP_REQUEST {
if { [HTTP::uri] contains "/ABC" } {
HTTP::header replace Host "www.baidu.com"
pool http_pool
}
else {
pool test_http
}
}
3.测试
1、创建VS,挂载irules
2、抓包测试
由以上抓包可以看到,F5与服务器三次握手后,转发客户端的 GET 请求,host已经修改为www.baidu.com
4.客户反馈
联系客户,挂载irules后,需求实现成功。