Apache-2.2
清漆 client.ip 說 127.0.0.1
所以我有一個像 Nginx -> varnish -> apache2 這樣的設置如果我收到一個帶有靜態文件的請求,它會通過 nginx 發送到 varnish 並再次返回到 nginx,因為它比讓 apache2 伺服器快得多。我的問題是,當我做
sub vcl_fetch { set beresp.http.X-Tabulex-Client = client.ip;
查看客戶端 IP 地址是什麼,我被告知它的 127.0.0.1 (X-Tabulex-Client 127.0.0.1) 在 vcl_recv 我有:
sub vcl_recv { if ((!req.url ~"^/typo3temp/*" && !req.url ~"^/typo3/*") &&req.url ~"\.(jpg|css|gif|png|js)(\?.*|)$"){ set req.backend = aurum; set client.identity = req.http.X - Forwarded - For; } elseif(client.ip == "192.168.3.189") { /* Traffic from the other Varnish server, serve using real backends */ set req.backend = balance; /* Set client.identity to the X-Forwarded-For (the real IP) */ set client.identity = req.http.X - Forwarded - For; } else{ /* Traffic coming from internet, use the other Varnish as backend */ set req.backend = iridium; } }
nginx 配置包含
proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_intercept_errors on;
第一次發送到清漆時,再次從清漆接收時什麼也沒有。
我不確定問題出在哪裡。我希望 client.ip 包含外部 IP 地址,以便我可以將它用於 acl。有任何想法嗎?
的價值
client.ip
是127.0.0.1
因為nginx
是客戶。Varnish 掩蓋這個值是沒有意義的——即使在像你這樣 Varnish 位於前端代理後面的情況下,你經常希望根據實際連接到 Varnish 的東西的 IP 地址做出決定。您真正想要做的是
nginx
將遠端客戶端 IP 地址放入專用標頭(您已經在使用該標頭X-Real-IP
)並使用它來做出連接決策。我們在我們的環境中正是這樣做的,其中 Apache 在前面提供了 SSL 連接varnish
,然後我們使用這個標頭來做出訪問決策。它不如 using 好
client.ip
(你不能用acl
s 匹配它),但它有效。我們做這樣的事情:if (! ( req.http.X-Real-IP ~ "^10\." || req.http.X-Real-IP ~ "^100\.100\." || req.http.X-Real-IP ~ "^200\.200\." )) { error 403 "Forbidden"; }
Varnish 不提供
client.ip
使用自定義標頭覆蓋的本機機制,但無論如何都可以解決問題,因為您可以將任意 C 程式碼插入到您的配置中。這是一個與您的情況完全相似的範例,其中包括一個替換
client.ip
為另一個值的範例,以便可以在 Varnish ACL 中使用它。