视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Varnish,Nginx做后端(多重代理)时获取用户真实IP
2020-11-09 13:22:55 责编:小采
文档


不得不说我有点问题,网站一个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,打开探针看了看,终于正常了……

下载本文
显示全文
专题