nginx 获取源IP
来源:互联网 发布:java五种排序算法 编辑:程序博客网 时间:2024/05/22 08:09
1. nginx 配置文件中获取源IP的配置项
- proxy_set_header
Host $host; - proxy_set_header
X-Real-IP $remote_addr; #一般的web服务器用这个 X-Real-IP 来获取源IP - proxy_set_header
x-forwarded-for $proxy_add_x_forwarded_for; #如果nginx 服务器是作为反向代理服务器的,则这个配置项是必须的;否则看不到源IP
2. nginx 代理服务器的模块
nginx 通过 ngx_http_proxy_module模块 实现反向代理;在nginx 启动服务loadconf时,
3. 3个配置项的含义
- host:只要 用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口
www.taobao.com:80 - X-real-IP:把源IP【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中$X-Real-IP
来获取 源IP - x-forwarded-for: 在nginx作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo$x-forwarded-for |awk -F, '{print $1}' 来作为源IP
4. 参考文章
http://zhidao.baidu.com/link?url=Yo2Ll5pSBADoGrAoTEBpU8pR
http://www.cnblogs.com/discuss/articles/1862259.html
http://www.douban.com/note/215633780/
如今利用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的addheader方法来设置返回头来查看。
下面来分析请求头到达Nginx负载均衡服务器的情况;在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxy_set_header参数设置:
proxy_set_header
$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
转载:http://www.cnblogs.com/yihang/archive/2010/12/19/1910365.html
测试环境: nginx+resin
IP: 内网:172.16.100.10
客户端IP:123.123.123.123
测试页面: test.jsp
out.println("x-forwarded-for: " +request.getHeader("x-forwarded-for"));
out.println("remote hosts: " +request.getRemoteAddr());
nginx 配置一
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
wget测试
wget -O aa --header="X-Forwarded-For:192.168.0.1""http://2hei.net/test.jsp"
页面返回结果:
x-forwarded-for: 192.168.0.1, 123.123.123.123
remote hosts: 172.16.100.10
curl测试
curl -H "X-Forwarded-For:192.168.0.1""http://2hei.net/test.jsp"
x-forwarded-for: 192.168.0.1, 123.123.123.123
remote hosts: 172.16.100.10
nginx 配置二
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
wget测试:
wget -O aa --header="X-Forwarded-For:192.168.0.1""http://2hei.net/test.jsp"
页面返回结果:
x-forwarded-for: 123.123.123.123
remote hosts: 172.16.100.10
curl测试
curl -H "X-Forwarded-For:192.168.0.1""http://2hei.net/test.jsp"
x-forwarded-for: 123.123.123.123
remote hosts: 172.16.100.10
测试结果:
1、配置
增加了一个真实ip X-Forwarded-For,并且顺序是增加到了“后面”。
2、配置
清空了客户端伪造传入的X-Forwarded-For,
保证了使用request.getHeader("x-forwarded-for")获取的ip为真实ip,
或者用“,”分隔,截取X-Forwarded-For最后的值。
参考:
http://hi.baidu.com/daizhongxian/blog/item/e074002c6bace6e28b13994d
http://en.wikipedia.org/wiki/X-Forwarded-For
http://wiki.nginx.org/NginxHttpProxyModule#proxy_set_header
http://wiki.nginx.org/NginxHttpLogModule
http://2hei.net/mt/2010/03/nginx-x-forwarded-for.html
- nginx 获取源IP
- nginx 获取源IP
- nginx 获取真实IP
- 获取nginx ip地理信息
- nginx中获取真实ip
- nginx中获取真实ip
- nginx获取客户端IP实现
- Nginx获取真实用户IP
- nginx中获取真实ip
- nginx lua获取真实IP
- 【原创】Python 获取IP地理位置
- linux ip地址自动获取,ip地址…
- lighttpd获取nginx代理客户端真实IP
- nginx+tomcat整合后获取真实IP
- Nginx 教程- 获取真实IP模块 - http_realip_module
- nginx反向代理,node获取真实IP
- Nginx反向代理获取客户端真实IP
- Nginx反向代理获取客户端真实IP
- 使用supervisor监控进程
- 如何解决“504 Gateway T…
- linux shell脚本用while&nbsp…
- web登录用户名密码加密
- Session存储到Redis
- nginx 获取源IP
- 笔试-汤森路透
- [置顶] 基于nutcracker …
- VS 使用自带的.NET Reflector单步调试编译好的程序集(反编译),以及相关其他反编译程序介绍
- 《将博客搬至CSDN》
- awk使用shell变量,shell获取awk中…
- Selenium WebDriver API
- PreLoadHack
- Android换肤技术总结