`
newleague
  • 浏览: 1480442 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Nginx做负载均衡时X-Forwarded-For信息头的处理

    博客分类:
  • http
阅读更多

如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的地方,本文要说的就是在通过CDN 后到达nginx做负载均衡时请求头中的X-Forwarded-For项到底发生了什么变化。下图为简单的web架构图:

 

先来看一下X-Forwarded-For的定义:
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。
标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
从标准格式可以看出,
X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。

按照上图的Web架构图,可以很容易的看出,当用户请求经过CDN后到达Nginx负载均衡服务器时,其X-Forwarded-For头信息应该为客户端IP,CDN的IP。但实际情况并非如此,一般情况下CDN服务商为了自身安全考虑会将这个信息做些改动,只保留客户端IP。我们可以通过php程序获得X-Forwarded-For信息或者通过Nginx的add header方法来设置返回头来查看。

下面来分析请求头到达Nginx负载均衡服务器的情况;在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxy_set_header 参数设置:
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr。

$remote_addr变量的值是客户端的IP

当Nginx设置X-Forwarded-For等于$proxy_add_x_forwarded_for后会有两种情况发生

1、如果从CDN过来的请求没有设置X-Forwarded-For头(通常这种事情不会发生),而到了我们这里Nginx设置将其设置为$proxy_add_x_forwarded_for的话,X-Forwarded-For的信息应该为CDN的IP,因为相对于Nginx负载均衡来说客户端即为CDN,这样的话,后端的web程序时死活也获得不了真实用户的IP的。

2、CDN设置了X-Forwarded-For,我们这里又设置了一次,且值为$proxy_add_x_forwarded_for的话,那么X-Forwarded-For的内容变成 ”客户端IP,Nginx负载均衡服务器IP“如果是这种情况的话,那后端的程序通过X-Forwarded-For获得客户端IP,则取逗号分隔的第一项即可

如上两点所说,如果我们知道了CDN设置了X-Forwarded-For信息,且只有客户端真实的IP的话,那么我们的Nginx负载均衡服务器可以不必理会该头,让它默认即可。

其实Nginx中还有一个$http_x_forwarded_for变量,这个变量中保存的内容就是请求中的X-Forwarded-For信息。如果后端获得X-Forwarded-For信息的程序兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),最好就不要将X-Forwarded-For设置为$proxy_add_x_forwarded_for。应该设置为$http_x_forwarded_for或者干脆不设置!

参考文章:http://en.wikipedia.org/wiki/X-Forwarded-For

 

分享到:
评论

相关推荐

    nginx四层代理测试 及SLB负载均衡功能配置测试

    这是因为nginx 四层代理不会将客户端的IP地址设置到x-forwarded-for头中,而是将自己的IP地址设置到x-forwarded-for头中。 二、SLB负载均衡功能测试 SLB(Server Load Balancer)是指一种负载均衡技术,可以将...

    Nginx+Tomcat负载均衡

    最近学习Nginx+tomcat实现 负载均衡。 首先大家注意: 本文章中没有session共享,关于session共享我会在下一篇中讲解,先实现Nginx+tomcat负载均衡再实现session共享。 从网上查了好多资料,多走了很多弯路,现在把...

    5、redis session 实现Nginx负载均衡多ip同步1

    Redis Session 实现 Nginx 负载均衡多 IP 同步 Redis Session 是一种基于 Redis 的会话管理机制,通过使用 Redis 来存储会话数据,实现了会话的持久化和共享。Nginx 负载均衡是通过使用 Nginx 服务器来实现多个...

    Nginx负载均衡配置.pdf

    Nginx 负载均衡配置 Nginx 负载均衡配置是一种常见的解决方案,它可以将网络流量分配到多个服务器上,以提高网站的可用性和性能。在本文中,我们将详细介绍 Nginx 负载均衡配置的实现过程。 一、测试环境 在开始...

    kangzhixing#k-doc#Nginx负载均衡1

    Nginx配置#请求转向upstream_name定义的服务器列表#将请求头转发给后端服务器#后端的Web服务器可以通过X-Forwarded-For获取用户真

    tomcat8 + nginx + memcached + cas 实现负载均衡的配置包

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; index index....

    Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享

    Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享 Nginx、Tomcat和Redis是三大热门的开源软件,分别代表着Web服务器、应用服务器和NoSQL数据库。通过将这三者结合,可以实现负载均衡、资源分离和session共享...

    Nginx反向代理以及配置优化.docx

    Nginx反向代理是指Nginx服务器充当反向代理服务器, Proxy Set Header指令用于设置HTTP头部信息,包括Host、x-forwarded-for等。反向代理的主要作用是将客户端的请求转发到后端服务器,以便实现负载均衡、缓存、...

    (阿里云负载均衡)或者 lvs+Tengine(nginx)+lua防护攻击:线上正式使用,可以修改lua达到自己想要效果

    (阿里云负载均衡)或者 lvs+Tengine(nginx)+lua防护攻击(获取用户真实ip):线上正式使用,可以修改lua达到自己想要效果; 记得修改以下获取真实ip function getClientIp() IP = ngx.var.http_x_forwarded_for ...

    Nginx快速入门1

    '"$http_user_agent" "$http_x_forwarded_for"'; access_log D:/Tools/nginx-1.10.1/logs/access.log main; #反向代理配置 upstream backend { server localhost:8080; } server { listen 80; location / {...

    深入理解BFE.pdf

    "深入理解BFE.pdf" 深入理解BFE.pdf是百度智能云架构师编写的一本关于BFE(Beyond Front End)的电子书籍。...自2012年开始建设以来,BFE每日转发...BFE的信息透传包括客户端IP地址透传、X-Forwarded-For、mod_header等。

Global site tag (gtag.js) - Google Analytics