Apache-2.2

清漆 client.ip 說 127.0.0.1

  • February 28, 2018

所以我有一個像 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.ip127.0.0.1因為nginx是客戶。Varnish 掩蓋這個值是沒有意義的——即使在像你這樣 Varnish 位於前端代理後面的情況下,你經常希望根據實際連接到 Varnish 的東西的 IP 地址做出決定。

您真正想要做的是nginx將遠端客戶端 IP 地址放入專用標頭(您已經在使用該標頭X-Real-IP)並使用它來做出連接決策。我們在我們的環境中正是這樣做的,其中 Apache 在前面提供了 SSL 連接varnish,然後我們使用這個標頭來做出訪問決策。

它不如 using 好client.ip(你不能用acls 匹配它),但它有效。我們做這樣的事情:

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 中使用它。

引用自:https://serverfault.com/questions/392033