Load-Balancing
根據客戶端 IP 清漆負載均衡器後面的 ACL
在以下設置中:
Client -> LB -> Varnish
我想配置 Varnish acls 以根據客戶端的 IP 採取某些操作。LB 在一個名為“ClientIP”的變數中發送客戶端的 IP,Varnish 可以通過
req.httpd.ClientIP.
我試過這個來讀取它:acl admin_net { "10.10.1.160"/27; } sub vcl_deliever { if (req.http.ClientIP ~ admin_net) { // do something ... } }
但 VCL 編譯失敗並顯示“預期 CSTR 得到 ‘admin_net’”(C 字元串?)。我可以通過 解決這個問題
req.http.ClientIP ~ "10.10.1.*")
,但我必須註釋掉 ACL 行。還有其他方法可以使用 ACL 嗎?我也看了看
client.ip
,這是一個只讀變數。在上述設置中,它包含 LB 的 IP,而不是客戶端的 IP。
實際上 Varnish 將 client.ip 處理為不同的數據類型,因此您可以針對該值使用 ACL。這不適用於像 req.http.ClientIP (或所有 req.http.* 參數)這樣的文本值。因此,具有此文本值的正則表達式似乎是一個很好的解決方案。
或者,您可以使用特定模組來設置 client.ip。例如,我發現了這個:http: //lassekarstensen.wordpress.com/2013/07/22/setting-client-ip-in-varnish-vcl-with-libvmod-ipcast/
這可以使用std.ip來完成,假設 ClientIP 標頭已在 vcl_recv() 中設置。例如:
vcl 4.0; import std; acl admin_net { "10.10.1.160/27"; } sub vcl_deliver { if (std.ip(req.http.ClientIP,"0.0.0.0") ~ admin_net) { // do something ... } }