配置Apache和Varnish获取真实来源IP

当使用varnish做http缓存加速器的时候,后端apache获取的请求为varnish发过去的,所以用 $_SERVER[‘REMOTE_ADDR’] 获取到的IP始终为 127.0.0.1。

下面对apache和varnish配置,使apache后端能获取到真实来源IP。

首先在varnish的配置文件的 vcl_recv 函数最前面添加如下一句:

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

注意最好是加在最前面,防止这句话没执行到就被pass了。

对于apache的配置,需要安装一rpaf扩展,执行如下命令安装:

apt-get install libapache2-mod-rpaf && a2enmod rpaf && apache2ctl graceful

然后在apache的配置文件,ubuntu中为 /etc/apache2/apache2.conf,添加如下配置:

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
</IfModule>

其中RPAFproxy_ips 为varnish服务器的地址,如果有多个,就写多个IP,如:RPAFproxy_ips 127.0.0.1 10.0.0.1

最后重启apache与varnish,在php中,$_SERVER[‘HTTP_X_FORWARDED_FOR’] 就能获取真实的客户端IP:

$client->doBackground('sendmsg', $_SERVER['HTTP_X_FORWARDED_FOR']);