Nginx如何保留真实IP和获取前端IP

原理:
squid,varnish以及nginx等,在做反向代理的时候,因为要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端web服务器得到的数据包的头部的源IP地址是代理服务器的IP地址,这样一来,后端服务器的程序给予IP的统计功能就没有任何意义,所以在做代理或集群的时候必须解决这个问题,这里,我以nginx做集群或代理的时候如何给后端web服务器保留(确切的说是传递)客户端的真实IP地址。

nginx实用X-Forwarded-For这个参数来解决这个问题我们用几个实例来解决

nginx.conf配置:


location / {   
     proxy_pass http://127.0.0.1:8080/myweb/;  
     proxy_set_header  Host             $host;  
     proxy_set_header  X-Real-IP        $remote_addr;  
     proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  
}  


java获取ip

/*** 
 * 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP, 
 * @param request 
 * @return 
 */  
public static String getClientIP(HttpServletRequest request) {  
    String fromSource = "X-Real-IP";  
    String ip = request.getHeader("X-Real-IP");  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("X-Forwarded-For");  
        fromSource = "X-Forwarded-For";  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("Proxy-Client-IP");  
        fromSource = "Proxy-Client-IP";  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
        fromSource = "WL-Proxy-Client-IP";  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getRemoteAddr();  
        fromSource = "request.getRemoteAddr";  
    }  
    appLog.info("App Client IP: "+ip+", fromSource: "+fromSource);  
    return ip;  
}  

猜你喜欢

转载自liang100100.iteye.com/blog/2374522