`
lavafree
  • 浏览: 539615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx做负载CDN加速获取端真实ip

阅读更多

在不用cdn的情况下,nginx做负载获取真实ip时,nginx配置如下:

 

proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
 

然后后端服务器获取ip代码:

 

String address = request.getHeader("X-Forwarded-For");
if (address != null && address.length() > 0
		&& !"unknown".equalsIgnoreCase(address)) {
	return address;
}
address = request.getHeader("Proxy-Client-IP");
if (address != null && address.length() > 0
		&& !"unknown".equalsIgnoreCase(address)) {
	return address;
}
address = request.getHeader("WL-Proxy-Client-IP");
if (address != null && address.length() > 0
		&& !"unknown".equalsIgnoreCase(address)) {
	return address;
}
return request.getRemoteAddr();

这样就能获取到真实的IP,服务器测试一下:

不加cdn,获取得IP:123.116.126.51(我当前客户端机器的真实IP)

然后加上加了cdn后,后去到的IP:123.116.126.51, 202.108.251.166hosts指向cdn的ip)

即:client 真实IP,代理IP,google之,

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项 。

标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
从标准格式可以看出,
X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的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,CDN的ip“如果是这种情况的话,那后端的程序通过X-Forwarded-For获得客户端IP,则取逗号分隔的第一项即可

 

这个比较头疼,如果只想获取客户端真实ip,那么只能修改我们后端代码,如果有多个,那么取第一个。这不是我想要的,

那么怎么样才能不修改就能真实IP呢?

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或者干脆不设置!

 

上面这段话的意思是我们不加 $proxy_add_x_forwarded_for, 但是这样不在cdn的情况下去会取不到真实IP,有没有一个两全齐美的方法呢?

经过几种配置之后,发现做如下配置:

 

proxy_set_header X-Forwarded-For  $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	

 

这样配置第一次获取 $http_x_forwarded_for,如果不存在,那么获取$proxy_add_x_forwarded_for。

这样不管是否在cdn环境,都可以获得一个客户端IP。

 

(注:多层代理未测试)

1
0
分享到:
评论
1 楼 s21109 2012-07-07  
嘿嘿 老大不甘寂寞啊 你可真不懒

相关推荐

    CDN获取真实IP

    ### CDN获取真实IP 在互联网应用中,内容分发网络(Content Delivery Network,简称CDN)是一种广泛采用的技术,用于加速网站内容的加载速度、提高访问稳定性和安全性。然而,当用户通过CDN访问网站时,服务器接收...

    cdn软件高级版(nginx反向代理方式实现)

    在提供的文件中,"jb51.net.txt"、"去脚本之家看看.url"和"服务器软件.url"可能是关于Nginx配置和CDN使用的一些参考资料,你可以查阅这些资料以获取更详细的实践指导。而"nginx"可能是Nginx的安装包或配置文件,用于...

    Nginx-配置负载均衡的几种方式

    首先,我们需要了解Nginx负载均衡的基本配置步骤: 1. **创建Upstream块**:在`http`节点下添加`upstream`节点,该节点用于定义一组后端服务器,Nginx将根据配置策略将请求分发给这些服务器。 ```nginx upstream ...

    idea,java获取ip地址

    当我们构建一个基于Servlet的Web应用程序时,有时需要获取访问用户的真实IP地址,这在处理用户请求、日志记录或者实现地理位置相关的功能时尤为关键。 Servlet是Java服务器端的一种组件,它扩展了Web服务器的功能,...

    使用Nginx轻松实现开源负载均衡.rar

    如果没有资金去购买昂贵的四/七层负载均衡交换机,那么Nginx是不错的七层负载均衡选择,并且可以通过 Nginx Keepalived 实现 Nginx 负载均衡器双机互备,任意一台机器发生故障,对方都能够将虚拟IP接管过去。...

    nginx-1.9.0.tar

    Nginx 1.9.0是该软件的一个特定版本,包含了对负载均衡、URL重写、反向代理以及地理IP区域分发等功能的支持。 **负载轮询(Load Balancing)** 在高并发访问的场景下,Nginx能够通过负载轮询将请求均匀地分配到多个...

    nginx-1.17.9_nginx_

    4. **CDN 结合**:Nginx 与 CDN 配合,可以加速全球范围内的内容分发。 总之,Nginx 1.17.9 是一款强大且灵活的 Web 服务器,它的高效性能、丰富的功能和易用的配置使其在各类应用场景中都有出色的表现。无论你是...

    nginx实现ssl之https改造(包含单机版以及负载均衡配置)

    四、Nginx负载均衡1. 如果你需要配置负载均衡,可以在nginx配置文件中添加upstream块,如下所示: ```perl upstream backend_servers { server backend1.example.com weight=3; server backend2.example.com; ...

    nginx-1.6.2

    4. **负载均衡**:Nginx内置负载均衡器,可以通过轮询、权重、IP哈希等多种策略分配请求到后端服务器,提升服务的可用性和响应速度。 ### 二、Nginx-1.6.2的主要特性 1. **HTTP/HTTPS支持**:支持HTTP/1.x协议,...

    nginx 映射本地文件

    **Nginx 本地文件映射详解** 在IT行业中,Nginx是一个广泛使用的高性能Web服务器和反向代理服务器,以其高效、稳定和轻量级的特性受到青睐。其中一个实用的功能是通过配置来映射本地文件,使得用户可以通过HTTP协议...

    Nginx+Tomcat 动静分离实现负载均衡.rar

    Nginx可以作为负载均衡器,根据预设的策略(如轮询、最少连接数、IP哈希等)将用户请求分发到不同的服务器,确保任何一台服务器都不会过载,从而提高整体系统的可用性和稳定性。Tomcat作为Java应用服务器,通常用于...

    搭建nginx下hls

    搭建Nginx下的HLS(HTTP Live Streaming)服务器是一项常见的任务,尤其对于...你可以根据实际需求进行扩展,例如添加认证机制、负载均衡、CDN集成等高级特性。记得定期更新Nginx和模块以获取最新的安全补丁和功能。

    誉天邹-Nginx网站架构1-5

    - **CDN集成**: 通过Nginx与第三方CDN服务结合,提高内容分发效率。 - **API网关**: 利用Nginx作为API网关,实现路由、限流、鉴权等多种功能。 #### 4.2 故障排查与监控 - **日志分析**: 通过分析Nginx的日志文件...

    nginx集成rtmp

    2. **负载均衡**:当用户数量增大时,可以考虑使用Nginx的负载均衡功能,将流分发到多个服务器。 3. **缓存与分发**:启用HLS(HTTP Live Streaming)可以让Nginx将RTMP流分割成小段HTTP可请求的TS文件,方便CDN...

    nginx教程.doc

    18. **CDN集成**:结合CDN服务,Nginx如何加速内容分发。 教程中还包含了学习笔记和参考资料,可以帮助读者更好地理解和应用所学知识。建议对Nginx感兴趣的运维和网管人员下载学习,提升自己的技能水平。获取教程,...

    《Nginx实际运用》.pptx

    •CDN加速•结合CDN网络,Nginx可作为边缘服务器,提供全球范围内的内容分发。12故障排查与维护故障排查与维护•查看Nginx日志•通过error.log和access.log找出问题所在。•Nginx状态监控•利用第三方工具如Nginx ...

    nginx+ftp相关资料配置ftp图片、音频服务器集群

    2. CDN加速:结合CDN(Content Delivery Network)服务,将图片资源缓存到全球各地的边缘节点,降低延迟,提高用户体验。 3. 访问控制:通过`nginx`的访问控制模块,限制非法IP的访问,保护服务器资源。 4. 日志分析:...

Global site tag (gtag.js) - Google Analytics