当使用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']);