Varnish 反向代理、apache 后端、转发 IP 无法持续​​工作

Varnish 反向代理、apache 后端、转发 IP 无法持续​​工作

这是我的 vcl 配置文件中与 IP 转发相关的部分:

sub vcl_recv {
    remove req.http.X-Forwarded-For;
    set req.http.X-Forwarded-For = client.ip;

    .... (other configuration)
}

sub vcl_pipe {
    set req.http.connection = "close";

    if (req.http.X-Forwarded-For) {
            set req.http.X-Forwarded-For = req.http.X-Forwarded-For;
    } else {
            set req.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
    }
}

sub vcl_pass {
    set req.http.connection = "close";

    if (req.http.X-Forwarded-For) {
           set req.http.X-Forwarded-For = req.http.X-Forwarded-For;
    } else {
           set req.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
    }
}

我已经安装了mod_rpaf,httpd.conf上的相关配置设置为:

RPAFenable On

RPAFsethostname On

RPAFproxy_ips 127.0.0.1 10.0.0.1 67.23.31.16

RPAFheader X-Forwarded-For

现在,我尝试使用$_SERVER["HTTP_X_FORWARDED_FOR"]php 内部来获取 IP 地址。第一次使用时成功,然后开始一片空白。同样,如果我过一会儿再尝试,比如说一分钟后,我又可以第一次获取到 IP 地址。

因此,基本上它不能持续工作或随机工作,或者准确地说,只能工作一次,并且不能再工作一段时间,然后又只能工作一次。非常奇怪。我感觉有些配置不正确。我花了相当多的时间在谷歌上搜索。到处都有人建议添加x-forward-for和安装 mod_rpaf 模块。如您所见,我正是这么做的。

任何帮助将不胜感激。

答案1

如果你只在接收函数子程序。请参阅此Varnish 流程图不同的子程序将如何处理请求。

您已将“RPAFsethostname”设置为“On”。据我所知,这是为了使用 X-Host 标头而不是 Host 标头。请检查您的 Varnish 设置是否需要这样做。通常不会使用/设置 X-Host 标头。

无论如何,使用 mod_rpaf 的想法是将 Apache 的 REMOTE_ADDR 值替换为 X-Forwarded-For 值。因此您不必更改脚本、基于 IP 的身份验证或日志记录。对于您的 PHP 脚本,我建议使用 $_SERVER['REMOTE_ADDR']。

如果这不能解决您的问题,请停用 mod_rpaf 模块。除了使用 $_SERVER['REMOTE_ADDR']、基于 IP 的身份验证或日志记录的脚本之外,其他一切都应该可以正常工作。如果问题没有解决,则您的 Varnish/Apache 设置中的其他某些东西无法组合在一起。

相关内容