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后,需求實現成功。