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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP相关的知识,希望对你有一定的参考价值。

/**
 * 获取访问者IP地址
 * <p>在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。</p>
 * <p>本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割)。</p>
 * <p>如果还不存在则调用Request.getRemoteAddr()。</p>
 * @param request
 * @return
 */
public static String getIp(HttpServletRequest request) 
String ip = request.getHeader("X-Real-IP");
if (ValidateUtil.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) 
return ip;

ip = request.getHeader("X-Forwarded-For");
if (ValidateUtil.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) 
int index = ip.indexOf(",");
if (index != -1) 
return ip.substring(0, index);
 else 
return ip;

 else 
return request.getRemoteAddr();

参考技术A proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
打开你的nginx.conf文件,找到类似配置项,核对一下是否有以上几个配置,以上配置中第2、3两行是解决你的问题的配置。

加入这两行,在java中就可以通过request.getRemoteHost()或其它方法取到客户端用户的入站IP,否只能取nginx服务器的ip。本回答被提问者采纳
参考技术B 要想取得真正的地址。hedaer

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

nginx不单能够作为强大的webserver,也能够作为一个反向代理server,并且nginx还能够依照调度规则实现动态、静态页面的分离。能够依照轮询、ip哈希、URL哈希、权重等多种方式对后端server做负载均衡,同一时候还支持后端server的健康检查。

假设仅仅有一台server时,这个server挂了,那么对于站点来说是个灾难.因此。这时候的负载均衡就会大显身手了,它会自己主动剔除挂掉的server.

Nginx负载均衡一些基础知识:

nginx 的 upstream眼下支持 4 种方式的分配 
1)、轮询(默认) 
      每一个请求按时间顺序逐一分配到不同的后端server,假设后端serverdown掉。能自己主动剔除。 
2)、weight 
      指定轮询几率。weight和訪问比率成正比,用于后端server性能不均的情况。

 
2)、ip_hash 
      每一个请求按訪问ip的hash结果分配,这样每一个訪客固定訪问一个后端server,能够解决session的问题。  
3)、fair(第三方) 
      按后端server的响应时间来分配请求。响应时间短的优先分配。  
4)、url_hash(第三方)

下面是详细使用步骤:

 1.        安装

1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本号(眼下是1.5.13版本号)安装包。

2)         解压后拷贝到部署文件夹。

 

2.        启动和停止Nginx

Nginx眼下仅仅支持命令行操作,操作前先进入Dos命令环境,并进入Nginx部署文件夹。

1)         启动Nginx:start nginx

2)         停止Nginx:nginx -s stop

3)         改动配置后重新启动:nginx -s reload

这三个命令可分别做成bat文件,放在部署文件夹下,方便兴许操作。

start nginx.bat文件内容:start nginx

stop nginx.bat文件内容:nginx -s stop

reload nginx.bat文件内容:nginx -s reload

 

3.        反向代理配置

改动部署文件夹下conf子文件夹的nginx.conf文件(如nginx-1.5.13\conf\nginx.conf)内容,可调整相关配置。

反向代理配置演示样例:

location / {

        #设置主机头和client真实地址,以便server获取client真实IP

             proxy_set_header Host $host;

             proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 

             #禁用缓存

             proxy_buffering off;

 

             #设置反向代理的地址

             proxy_pass http://192.168.1.1;       

      }

代理地址依据实际情况改动。

 

4.        负载均衡配置

nginx 的 upstream默认是以轮询的方式实现负载均衡,这样的方式中,每一个请求按时间顺序逐一分配到不同的后端server,假设后端serverdown掉。能自己主动剔除。

第二种方式是ip_hash:每一个请求按訪问ip的hash结果分配,这样每一个訪客固定訪问一个后端server,能够解决session的问题。

 

 

负载均衡配置演示样例:

upstream backend {

             #ip_hash;

 

             server 192.168.1.251;

             server 192.168.1.252;

             server 192.168.1.247;

         }

 

server {

        listen       80;

        server_name  trffweb;

 

        location / {

 

             #反向代理的地址

             proxy_pass http://backend;     

        }

}

 

Upstream命名和server地址依据实际情况改动。

 

5.        完整配置演示样例

nginx.conf:

 

worker_processes  1;

events {

    worker_connections  1024;

}

 

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

 

    upstream backend {

             #ip_hash;

             server 192.168.1.251;

             server 192.168.1.252;

             server 192.168.1.247;

         }

 

    server {

        listen       80;

        server_name  2;

 

        location / {

        #设置主机头和client真实地址,以便server获取client真实IP

             proxy_set_header Host $host;

             proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 

             #禁用缓存

             proxy_buffering off;

 

             #反向代理的地址

             proxy_pass http://backend;     

        }

    }

 

}














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

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

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

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

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

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

配置 Nginx 反向代理 WebSocket