`
liang100100
  • 浏览: 35999 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

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;  
}  

分享到:
评论

相关推荐

    Nginx作为反向代理时传递客户端IP的设置方法

    因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。 同样适用于前端是 Squid 或者...

    让iis记录nginx反向代理的真实ip

    在f5的开发论坛上找到的,按开发者的话说,是为了解决iis放在f5后记录不到用户ip的问题,管他前端是f5还是nginx还是squid还是haproxy,都可以用。装完之后重启下iis即可。https://devcentral.f5.com/weblogs/J

    nginx-goodies-nginx-sticky-module-ng-s12451asdasd

    目前的项目网站架构中使用了F5和nginx,F5用来...还有一个重要原因是我们的nginx不在最前端,所以只能放弃使用ip_hash。上网搜索了一番,知道了nginx-sticky-module这个第三方模块可以基于cookie实现会话保持,决定试试

    nginx安装部署和配置管理

    nginx 本着开源精神 小白一枚,大家一起努力! HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一...

    ansible-role-nginx-proxy:安装Nginx用作前端代理

    安装Nginx用作前端代理。 依存关系 需要nginx角色(自动包含)。 角色变量:主要的Nginx配置 nginx_proxy_worker_processes :工作进程数,默认为1 nginx_proxy_worker_connections :工人连接数,默认1024 nginx...

    LNAMP架构中后端Apache获取用户真实IP地址的2种方法

    Nginx作为前端,Apache作为后端的情况下,Apache只能获取到Nginx前端的ip地址(127.0.0.1),而无法获取到用户的真实ip地址,在这种情况下,后端Apache如何获取用户真实IP地址?

    Nginx+Tomcat+Redis实现session共享

    Nginx+Tomcat+Redis实现session共享,通过Nginx作为前端的负载,把请求分发到后端的Tomcat服务器上,提高并发数;但是单纯的通过Nginx的ip_hash负载是很多问题的。只要用户一切换网络或者后端Tomcat主机宕机session就...

    Vue中跨域及打包部署到nginx跨域设置方法

    一般来讲,前后端分离的项目在大公司都会由后台设置允许跨域访问,因为后台设置允许跨域是很简单和方便的,但是某些情况下,一些小公司或者你工作的场所后台不怎么配合的情况下,这就需要前端来配置跨域请求来方便我们...

    nginx外网访问内网站点配置操作

    前端内网地址:192.168.1.10:81 API内网地址:192.168.1.12:8080 外网域名:abc.ab.com 外网IP:10.114.X.X 需求: 通过域名可以访问站点且站点静态资源且可访问API请求数据 方案一:(前提:外网域名映射服务器外网...

    详解nginx同一端口监听多个域名和同时监听http与https

    详解nginx同一端口监听多个域名和同时监听http与https 1、同一端口监听多个域名 如今公网ip资源越来越珍贵,多域名监听应用非常广泛,就是用一个端口,比如80或者443,监听多个入口域名。如下: server { ...

    docker-cephfs-nginx:容器中 CephFS 的 httpnginx 前端

    ##A http/nginx 前端到容器中的 CephFS。 这个 docker 容器挂载了一个 ceph 文件系统,然后通过 HTTP (nginx) 公开挂载以供下载和上传 (PUT)。 在 8 节点 Ceph 集群上的 CoreOS 上测试。 基于Ceph 设置 从 ...

    Red Hat Enterprise Linux+Nginx软件安装指南

    前端Nginx主备,负载均衡。 两台应用服务器每台都与负载均衡器相连,负载均衡器分配WEB请求到应用服务器。两台负载均衡器对外提供单一IP地址WEB服务; 通过heartbeat管理故障切换集群中可用的负载均衡分配器nginxd...

    nginx+keepalived+tomcat+redis文档

    这里配置Keepalived + Nginx + Tomcat + Redis的架构,其中:keepalived用于管理Virtual IP,与nginx一起搭配实现高可用性的反向代理前端;后端使用Tomcat管理web服务,并利用Redis实现session共享。

    详解Nginx 502错误解决办法

    因为nginx找不到php-fpm了,所以报错,一般是fastcgi_pass后面的路径配置错误了,后面可以是socket或者是ip:port 2.资源耗尽 lnmp架构在处理php时,nginx直接调取后端的php-fpm服务,如果nginx的请求量偏高,我们又...

    详解nginx前端根据$remote_addr分发方法

    使用nginx的模块,在前端负载均衡转发的机器上,配置匹配规则; nginx配置vhost里面,域名下面location段,增加一段代码 如果$remote_addr 匹配到ip的话,转发到abc_test_server; server { listen 80; server_...

    解决nginx+lua搭建文件上传下载服务问题

    前端请求 nginx 服务, nginx 调用 upload 脚本,脚本通过查找配置,找到对应的逻辑存储路径和物理存储机器的 agent 的 ip 和端口,通过 tcp 发包到对应 agent ,部署在对应机器的 agent 接受数据,并写到本地文件。...

    关于nginx没有跳转到upstream地址的解决

    今天在nginx碰到一个很奇怪的问题,在前端tomcat跳转页面的时候跳转的是upstream的地址,直接就报404,但是有些页面访问又是正常的。 http://tomcat/tomcat-web/account/index 如果直接用内网ip访问是正常的,所以...

    Nginx转发socket端口配置详解

    Nginx 转发 socket 端口常见场景:在线学习应用,在常规功能之外,增加一个聊天室功能,后端选择 swoole 提供服务提供者,同时不想前端直接 ip:port 方式链接到服务,需要使用 Nginx 进行转发。 常规情况,我们可以...

    项目部署 – Linux( springboot + vue + nginx)

    一、后台项目(Springboot) 1.项目打成jar包 在项目target目录里会有打包的jar ...三、配置nginx 前端工程 和后台api接口转发 server { listen 80; server_name 你自己的IP; #前端页面 location / { #Linux上

    即时通讯源码一套,亲测功能全正常

    即时通讯源码一套,亲测功能全正常 内有详细搭建教程 ...ip:7000和ip:7001 ip:7000运行路径fcim/admin ip:7001运行路径fcim/h5 前端http://你自己ip:7000 后端http://你自己ip:7001 账号admin 密码123456

Global site tag (gtag.js) - Google Analytics