不得不说我有点问题,网站一个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:)!