运维前几天把piwik切换到了Nginx后端,并且服务器加了HA 代理分发,piwik主机仅负责收集数据,包括数据库读写分离,但今天看了下数据发现所有来源IP都是代理IP,因为要对接大数据组,所以抓取丢给kafka的用户ip也都是代理ip,被大数据组骚扰了两天,今天就排查了下问题。
首先是服务器

location / {
    proxy_pass        http://xxxx_piwik;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    ##HTTP_X_REAL_IP的值是nginx得到的用户REMOTE_ADDR##
}

然后,还是获取的代理ip,说明不是Nginx后端问题。

那就查看是否为piwik代码原因,找到了piwik下core下IP.php文件,在其getIpFromHeader()方法里,发现获取ip直接$_SERVER['REMOTE_ADDR']获取的,修改代码,代码如下:
get ip
提交,结果还是获取的代理ip,说明不是piwik代码问题。

那就检查piwik的配置文件,首先是config下面的global.ini.php文件,找到了ip配置的部分,如图
global.ini
尝试修改了下配置,将proxy_client_headers[] = HTTP_X_FORWARDED_FOR 前面的分号去掉,启用,但还是获取的代理ip

那就查看另外一个配置文件config.ini.php,修改该文件,如图
config.ini
加上proxy_client_headers[] = HTTP_X_REAL_IP 运行,测试成功,获取到了用户的真实ip地址,大功告成!

期间还参考了阿里的文档获取客户端真实IP

最后修改:2023 年 09 月 11 日
如果觉得我的文章对你有用,请随意赞赏