Nginx多级代理,获取客户端真实请求IP以及每级代理IP

转载:http://blog.csdn.net/simonchi/article/details/53944308


Nginx多级代理,获取客户端真实请求IP以及每级代理IP


如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印IP地址。


原理分析:

只有客户端直接请求到的那个nginx能够拿到客户端的真实IP,所以第一级nginx配置了

proxy_set_header X-Real-IP $remote_addr;

这个配置就会将客户端IP放到http的header里,这样到最后的应用里可以通过request.getHeader去拿到客户端真实IP了

  1. public String getRemoteIp() {  
  2.         String ip = request.getHeader("X-Forwarded-For");  
  3.         if (isEffective(ip) && ip.indexOf(",") > -1) {  
  4.             String[] array = ip.split(",");  
  5.             for (String str : array) {  
  6.                 if (isEffective(str)) {  
  7.                     ip = str;  
  8.                     break;  
  9.                 }  
  10.             }  
  11.         }  
  12.         if (!isEffective(ip)) {  
  13.             ip = request.getHeader("Proxy-Client-IP");  
  14.         }  
  15.         if (!isEffective(ip)) {  
  16.             ip = request.getHeader("WL-Proxy-Client-IP");  
  17.         }  
  18.         if (!isEffective(ip)) {  
  19.             ip = request.getHeader("HTTP_CLIENT_IP");  
  20.         }  
  21.         if (!isEffective(ip)) {  
  22.             ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
  23.         }  
  24.         if (!isEffective(ip)) {  
  25.             ip = request.getRemoteAddr();  
  26.         }  
  27.         return ip;  
  28.     }  
  29.   
  30.     private boolean isEffective(String remoteAddr) {  
  31.         if ((null != remoteAddr) && (!"".equals(remoteAddr.trim()))  
  32.                 && (!"unknown".equalsIgnoreCase(remoteAddr.trim()))) {  
  33.             return true;  
  34.         }  
  35.         return false;  
  36.     }  
如何拿到用户从请求源头到应用所经过的各个代理IP呢?

 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
通过如上配置,将每级代理IP与$remote_addr用逗号分隔开


所以从上述情况来看,整体的流程很清晰了:

客户端请求(172.23.11.251) -->172.23.26.130-->172.23.26.132-->172.23.26.133-->172.23.30.100(具体应用)


但是我们发现上面IP貌似打印少了一个133的地址,我们在100上修改下echo测试



这里打印出了133的地址


nginx的安装包里有一个http_realip_module模块,在编译的时候可以编译此模块

./configure --prefix=/home/nginx/install --with-pcre=../pcre-8.36 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-1.0.2 --add-module=/root/nginx/echo-nginx-module-0.60 --with-http_realip_module && make && make install


新的配置如下:


set_real_ip_from   172.23.0.0/16;     IP段,指定接收来自哪个前端发送的 IP head 可以是单个IP或者IP段
set_real_ip_from   192.168.1.1;     单个IP
real_ip_header     X-Real-IP;         IP head  的对应参数,默认即可,含义是客户端真实IP从哪个头取?

real_ip_recursive on;  是否递归解析real_ip_header


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

maple 枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值