nginx做反向负载均衡,后端服务器获取真实客户端ip(转)

首先,在前端nginx上需要做如下配置:

location /

proxy_set_hearder host                $host;

proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;

proxy_set_header X-real-ip           $remote_addr;

};

nginx会在把请求转向后台real-server前把http报头中的ip地址进行替换;这样操作完成后,real-server也需要做一些操作;

 

public class ClientIPUtils {
 /**
  * 在很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地
  * 址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等
  * 反向代理软件就不能获取到客户端的真实IP地址了。
  * 但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。
  * @param request
  * @return
  */

public static String getClientIp(HttpServletRequest request) {

           String ip = request.getHeader("x-forwarded-for");

     //String ip = request.getHeader("X-real-ip");

            logger.debug("x-forwarded-for = {}", ip);
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getHeader("Proxy-Client-IP"); 
               logger.debug("Proxy-Client-IP = {}", ip); 
           }
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getHeader("WL-Proxy-Client-IP");
               logger.debug("WL-Proxy-Client-IP = {}", ip);
           }
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getRemoteAddr();
               logger.debug("RemoteAddr-IP = {}", ip); 
           }
           if(StringUtils.isNotBlank(ip)) {
               ip = ip.split(",")[0];
           }
           return ip;

       }

}

 

http://www.cnblogs.com/lhj588/p/4344354.html

时间: 2024-09-16 08:58:46

nginx做反向负载均衡,后端服务器获取真实客户端ip(转)的相关文章

[原创]分析解决lvs fullnat模式下后端服务器获取真实IP地址异常问题

摘要 分析解决lvs fullnat模式下少量的请求记录client IP不是用户真实的IP地址问题. 原创文章:来自分析lvs fullnat模式下后端服务器获取真实IP地址异常问题 问题背景 lvs fullnat模式下观察后端服务器realserver http/https业务运行系统日志,有时候可以发现有少量的请求记录的client IP不是用户真实的IP地址(存在但出现的概率很小,增加了问题排查的难度),而是属于lvs主机私有的IP地址.关于fullnat的简介可以参考http://w

关于httpservletrequest的获取真实的ip

via 值为: 下面是一些DemoWTP/1.1 GDSZ-PS-GW010-WAP05.gd.chinamobile.com (Nokia WAP Gateway 4.0 CD3/ECD13_C/NWG4.0 CD3 ECD13_C 4.1.03)   下面是解释 列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求.当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加Via头部,并填上自己的相关信息,当下一个代理服务器收到第一个

nginx+tomcat做的负载均衡

问题描述 nginx+tomcat做的负载均衡 求助个问题,nginx+tomcat做的负载均衡,在高并发时,怎么做到线程同步策略,例如,四台服务器上面部署了四个tomcat,在高并发请求时,毕竟一个tomcat只能锁住一个线程,在这种情况下,怎么样实现对请求的锁的控制? 解决方案 一.为什么需要对Tomcat服务器做负载均衡: Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果有超过500的并发数便会出现Tomcat不能响应新的请求的情况,严重影响网站的运行.另外,在访

Nginx/LVS/HAProxy 负载均衡软件的优缺点详解

Nginx/LVS/HAProxy 负载均衡软件的优缺点详解 Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术.具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了:如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的:大型网站或重要的服务,且服务器比较多时,可以考虑

android做json解析,从服务器获取资源

问题描述 android做json解析,从服务器获取资源 public static List<Model> getJSONResource(String path) throws Exception { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setConnectTimeout(5000); connection.se

NGINX前端代理TOMCAT取真实客户端IP

nginx前端代理tomcat取真实客户端IP 使用Nginx作为反向代理时,Tomcat的日志记录的客户端IP就不在是真实的客户端IP,而是Nginx代理的IP.要解决这个问题可以在Nginx配置一个新的Header,用来存储$remote_add,然后再Tomcat获取记录这个值. 新增nginx配置.   server { listen 80; server_name www.xxxxx.com; location / { proxy_pass http://IP:8080/; proxy

服务器搭建:手把手教你玩nginx+tomcat的负载均衡

   配置前你需要有的: jdk环境 tomcat环境 nginx环境     配置前你需要清楚的: nginx的pid位置(默认是在/usr/local/nginx/logs/nginx.pid) nginx启动命令的位置(我博客里的位置是/usr/loca/nginx/sbin/nginx) nginx配置文件的位置(我博客里的位置是/usr/local/nginx/nginx.conf) nginx的lockfile位置(默认位置是/usr/local/nginx/nginx.conf)

windows使用nginx实现网站负载均衡测试实例_win服务器

如果你关注过nginx,必定知道nginx这个软件有什么用的,如果你的网站访问量越来越高,一台服务器已经没有办法承受流量压力,那就增多几台服务器来做负载吧.做网站负载可以买硬件设备来实现,比如F5,不过价格就几十万到上百万,够贵,本文介绍做网站负载的软件是免费的,nginx目前好多门户网站与大访问量的网站都在使用做为HTTP服务器,所以nginx是非常优秀的,下面介绍做负载测试吧.环境:(2台服务器)第一台: CPU:Inter(R) Pentium(R) 4 CPU 2.8G 内存:1G 系统

(总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解

PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术.具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了:如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的:大型网站或重要的服务,且服务器比较多时,可以考虑用LVS. 一种是通过硬件来进行进行,常见的硬件有比较昂