当前位置:首页 > PHP教程 > PHP总结归纳

Varnish,Nginx做后端(多重代理)时获取用户真实IP

不得不说我有点问题,网站一个apache+varnish不够,还要在apache和varnish之间插入个第三者——nginx。 因为某些需要,也给该服务器上的个别网站上了cdn。 apache做后端,前面多一个nginx proxy cache+varnish,获取用户的真实ip不难,只需给apache上一个rpa

不得不说我有点问题,网站一个apache+varnish不够,还要在apache和varnish之间插入个第三者——nginx。

因为某些需要,也给该服务器上的个别网站上了cdn。
apache做后端,前面多一个nginx proxy cache+varnish,获取用户的真实ip不难,只需给apache上一个rpaf模块就行了,然后让varnish处理xff的内容就好了:

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;
       }
     }

无cdn的情况下访问网站,可以正确获取到用户的真实ip。

最近给网站上多了一个cdn,rpaf模块就显得无能为力了。因此,这几天一直苦恼如何让我的网站获取用户真实ip。
问了下那家cdn的客服,给了我这个回答:
当使用cdn后,网站服务器访问日志中的ip地址都将记录为cdn服务器的官方ip。您可以通过下列方式获取访问用户的原始ip:
asp
request.servervariables("http_x_forwarded_for")
php
$_server["http_x_forwarded_for"]
jsp
request.getheader("http_x_forwarded_for")

似乎是要我修改我的网站的代码吧,不过这指标不治本,况且ioncube加密后的,修改是没什么可能的了,问他们能否修改nginx配置文件实现,不理我了……

看来还是得靠自己。他们既然能把那些代码发来,就证明他们的cdn服务器把真实ip存放在了http_x_forward_for里面,那么让nginx处理一下cdn服务器发来的xff的内容就行了了。

首先,取消varnish处理xff,把cdn传输的xff直接交给nginx处理,也就是注释掉以下内容:

#     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;
#       }
#     }

然后在nginx的对应域名的setver层的location /层加进一行代码:

proxy_set_header ? ?x-forwarded-for $http_x_forwarded_for;

重启nginx,打开探针看了看,终于正常了……


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!