域名访问分发
发布时间:2022-11-18 11:06:31

1.背景描述

1.1问题描述

客户F5是7层负载,F5下面有两台Nginx服务器,真实服务器位于Nginx之后,客户说Nginx只接受域名的访问连接,现要实现对于uri包含 /ABC 的链接负载到Nginx 服务器对应的pool,其他链接负载到默认pool。

1.2拓扑

1.png

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.png

3.png

2、抓包测试

4.png

由以上抓包可以看到,F5与服务器三次握手后,转发客户端的 GET 请求,host已经修改为www.baidu.com

4.客户反馈

联系客户,挂载irules后,需求实现成功。


咨询电话
400-068-1180