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 服务器是做为反向代理服务器的,则这个配置项是必须的;不然看不到源IPhtml
2. nginx 代理服务器的模块
nginx 经过 ngx_http_proxy_module模块 实现反向代理;在nginx 启动服务load conf时,
就会读取 proxy_set_header 的配置项;来获取须要的变量。proxy_set_header 是用来设置请求的header的;
好比:设置上面的host X-Real-IP x-forwarded-for linux
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}' 来做为源IPnginx
4. 参考文章
http://zhidao.baidu.com/link?url=Yo2Ll5pSBADoGrAoTEBpU8pRrCk5rR57FTGTSSwUzkioDPRJ52zAKLpME1tcgjxv4-WEIwg5brp3g_VophAHk_web
http://www.cnblogs.com/discuss/articles/1862259.html浏览器
http://www.douban.com/note/215633780/安全
---------------------
做者:caoshuming_500
来源:CSDN
原文:https://blog.csdn.net/caoshuming_500/article/details/20952329 服务器
一般系统出于安全考虑,须要进行权限(帐号、密码)和IP白名单控制。如何获取访问来源真实的IP,若是公司网络入口设置负载,本身系统设置nginx代理等操做,会使你达到目的不那么简单直接。网络
一般状况下咱们使用request.getRemoteAddr()就能够获取到客户端ip,可是当咱们使用了nginx做为反向代理后,因为在客户端和web服务器之间增长了中间层,所以web服务器没法直接拿到客户端的ip,经过$remote_addr变量拿到的将是反向代理服务器的ip地址。若是咱们想要在web端得到用户的真实ip,就必须在nginx这里做一个赋值操做,以下:
proxy_set_header X-real-ip $remote_addr;
其中这个X-real-ip是一个自定义的变量名,这样用户的真实ip就被放在X-real-ip这个变量里了,而后,在web端能够这样获取:request.getAttribute("X-real-ip")。可是若是中间通过N次代理过来的请求,X-real-ip就只能得到到前一层代理的IP(10.6.61.14)了,下面是个人解决方案:负载均衡
红色部分IP是使用X-Forwarded-For(简称XFF头)获取的:,它表明客户端,也就是HTTP的请求端真实的IP,只有在经过了HTTP 代理或者负载均衡服务器时才会添加该项(没有通过的获取为空)标准格式以下:
X-Forwarded-For: client1, proxy1, proxy2
从标准格式能够看出,X-Forwarded-For头信息能够有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经通过的代理或负载均衡的ip地址,通过几个就会出现几个。
个人Nginx具体配置以下:url
关于参数含义:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
意思是增长(不是覆盖)一个$proxy_add_x_forwarded_for到X-Forwarded-For里去。
举个例子,有一个web应用,在它以前经过了两个nginx转发。在第一台nginx中,使用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
如今的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,因此只有$remote_addr,而$remote_addr的值是用户的ip,因而赋值之后,X-Forwarded-For变量的值就是用户的真实的ip地址了。
到了第二台nginx,使用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
如今的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,因而经过这个赋值之后如今的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”。
因此我在程序中使用request.getHeader("x-forwarded-for").toString().split(",")[0]就能获取到访问客户的真实IP,不用担忧前面有几层转发啦。--------------------- 做者:zhenzhendeblog 来源:CSDN 原文:https://blog.csdn.net/zhenzhendeblog/article/details/49702575