0

我面临一个问题,即在特定情况下清漆没有发送中间代理 IP 或公共 IP。场景如下:

  • 一些酒店/公司配置了 squid 代理,所有 Internet 流量都通过 Squid 路由。

  • 访问我公司网站的用户首先点击负载均衡器,然后是 Varnish,然后是 Apache

  • Apache 配置了 mod_geoip。我网站上的代码根据 IP 地址进行国家/地区重定向。

问题 :

  • 当用户(在该 squid 代理后面)访问负载均衡器后面的我公司的网站时 -> VARNISH -> Apache - 这里 apache 仅获取内部 IP(他的私有 IP)和负载均衡器内部 IP 作为 X-forwarded-for 并因此基于 IP重定向失败!

在 Apache 日志(配置为记录 X-Forwarded-IP)中,我看到用户私有 IP 和我的负载均衡器私有 IP。

172.10.5.10,LoadBalancerIP - - [.......]

  • 同一用户在访问另一个没有 Varnish 的站点时,点击负载均衡器 - > Apache - 这里 apache 将用户私有 IP 和用户公共 IP 作为 X-forwarded-for 和基于 IP 的国家/地区重定向工作正常。

在 Apache 日志(配置为记录 X-Forwarded-IP)中,我看到用户私有 IP,然后他的公共 IP 也被记录。

172.10.5.10,公共IP - - [.......]

我的清漆配置如下。

       if (req.restarts == 0) {
                   if (req.http.x-forwarded-for) {
                 set req.http.X-Forwarded-For =
                     req.http.X-Forwarded-For + ", " + client.ip;
                   } else {
                 set req.http.X-Forwarded-For = client.ip;
                   }
           }

PS:我已经用谷歌搜索了我能找到的所有链接,每个链接都给出了以下 Varnish 配置

现在要解决这个问题,我不得不绕过 varnish,现在网站流量直接到达 Apache,但我需要让 Varnish 回到原位,以从缓存和 Speedy 交付中获取服务器内容。

如果有人可以指导我如何解决此问题,将不胜感激。

谢谢!

4

2 回答 2

1

上述问题已解决。归功于 Mithrandir @ Varnish IRC 频道。谢谢!下面提到的更改是解决问题所必需的。

在 default.vcl 的开头添加:

import std;

在“ if (req.http.x-forwarded-for) ”下方添加:

std.collect(req.http.x-forwarded-for);
  • 做清漆配置测试并重新加载。这应该开始显示公共 IP。

  • 以下是 vmod_std 文档的解释:

收集

   Prototype
          collect(HEADER header)

   Return value
          Void

   Description
          Collapses the header, joining the headers into one.

   Example
          std.collect(req.http.cookie); This will collapse several Cookie:
          headers into one, long cookie header.
于 2013-04-09T11:15:36.707 回答
0

在 Varnish 4 中,这不再需要,请参阅此处的升级信息

于 2016-12-11T02:18:09.890 回答