所以我有一个像 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 来匹配它),但它确实有效。我们做这样的事情:Varnish 不提供
client.ip
用自定义标头覆盖的本机机制,但无论如何都可以解决问题,因为您可以将任意 C 代码插入到您的配置中。这是一个与您的情况完全相似的示例,其中包括一个替换
client.ip
为另一个值的示例,以便它可以在 Varnish ACL 中使用。如果您使用 Varnish 作为 Rackspace Cloud Load Balancer 后面的前端网络服务器(我们的后端是 NGINX),那么您需要使用如下模式:
Rackspace Cloud Load Balancer 除了
127.0.0.1
将client.ip
. 另外,我尝试使用更具限制性的模式,^2\.3\.4\.5$
但它不匹配。我认为负载平衡器正在向标头添加额外的字符X-Forwarded-For
。如果 req.http.X-Real-IP 在您的请求中可用,那么您可以使用 std 模块的函数 ip() 将字符串(如 req.http.X-Real-IP)转换为 IP 类型,然后使用 ~ 运算符将其与 ACL 列表进行比较。这比使用某些 IP 字符串比较 multipe 时间更有效。
acl aclRestricted { "1.1.1.1"; "2.2.2.2"; } if (std.ip(req.http.X-Real-IP, "0.0.0.0") ~ aclRestricted ) { ... }
参考 Varnish V4.1:https ://varnish-cache.org/docs/4.1/reference/vmod_std.generated.html#func-ip