nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户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;


参考技术A 首先,在前端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;

LVS四层 VS Nginx七层反代(负载均衡)

1、场景:

最近不少朋友聊天谈到面试总是问到LVS四层反代和Nginx七层反代,有点不知所措。

负载均衡可以将用户的请求分发到 web集群的某台机器,反向代理也是实现了这个功能。如果后端是一台服务器就叫反向代理,如果有多台就是负载均衡。反向代理才能实现负载均衡 负载均衡是做反向代理的目的之一。

2、博主则探讨一下四层反代和的七层反代的区别(三层负载均衡不探讨),如有不足,请指出。

技术图片
技术图片

3、问到LVS四层、七层反代(负载均衡),则可以通过上面几个方式谈:

3.1)技术原理

3.2)优缺点

3.3)安全性

3.4)应用场景

3.5)工作原理

3.6)四层七层的选择

以上是关于nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP的主要内容,如果未能解决你的问题,请参考以下文章

Nginx反向代理和负载均衡部署指南

linux基础服务器架设nginx 反向代理&负载均衡

nginx反向代理访问很慢,我做了负载均衡,现在几乎无法访问,有谁能帮我解决一下,万分感谢。

Nginx反向代理+负载均衡简单实现

Nginx反向代理实例与负载均衡实现(全网详解)

配置 Nginx 反向代理 WebSocket