我目前有以下配置设置:
负载均衡器到 Varnish 缓存(x2 服务器)到 Web 节点(x3 服务器)(Apache、PHP)
我目前已在 Varnish 中设置req.http.X-Forwarded-For = client.ip
,它应该将 IP 地址传递给 Apache 节点。Apache 节点还运行 mod_rpaf,它应该可以帮助服务器使用 X-Forward-IP 而不是 Varnish 缓存 IP。
这部分对我来说没问题,但我遇到了另一个问题。目前,只有负载均衡器接收请求并要求 Varnish 缓存页面。这意味着 Apache 只记录负载均衡器的 IP 地址。但是,负载均衡器还会在请求中向 Varnish 发送 X-Forwarded-For 标头。我该如何将此标头传递给 Apache 服务器?
答案1
如果您只是对“真实”客户端 IP 感兴趣,那么请将req.http.X-Forwarded-For = client.ip
设置从 Varnish 中完全取出。
然后 Varnish 将不再与标头进行交互 - 它应该将负载均衡器设置的标头传递给 Apache,从而允许 Apache 查看并记录“真实”客户端 IP。
答案2
运行nginx -V
并确保你有--with-http_realip_module
如果是这样,请将以下内容添加到您的/etc/nginx/nginx.conf
HTTP 头部分
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
完成后service nginx restart
(或/etc/init.d/nginx restart
)
这已在 varnish 3.0.4 上进行了测试并且 100% 有效。
******:varnishd -V
varnishd (varnish-3.0.4 revision 9f83e8f)
答案3
所选答案并不完全正确(至少对于 Varnish 3、AWS 上的 apache,您需要像这样放置 varnish 设置:
sub vcl_recv {
set req.backend = dsbalancer;
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
和
然后在 httpd.conf LogFormat 中添加一个指令来记录它。