nginx利用反向代理实现获取用户真实ip

本文介绍了在使用nginx作为反向代理时如何获取客户端真实IP的问题。通过proxy_set_header设置X-real-ip,将客户端IP传递给后端服务器,以解决request.getRemoteAddr()获取到的是反向代理服务器IP的状况。并模拟了在server1和server2之间的配置,以展示如何在有反向代理的情况下获取用户的真实IP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下所有的实操都是在redhat7.3上


我们访问互联网上的服务时,大多数时,客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理,反向代理再转发到服务端实现服务访问,通过反向代理实现路由/负载均衡等策略。这样在服务端拿到的客户端IP将是反向代理IP,而不是真实客户端IP,因此需要想办法来获取到真实客户端IP

web服务器获得真正的用户和真实的ip ?
客户端访问服务端的数据流走向

172.25.0.1(client)->192.168.0.1(拨号
ADSL)->cdn(10.0.0.1)->slb(阿里云11.0.0.1)(反向代理)(4层负载均衡)–>->12.0.0.1(server(nginx)(真实的服务器))
server1 服务器
server2 反向代理
客户端 测试

可以看出,服务端根本获取不到真实的客户端ip,只能获取到上一层服务的ip,那么nginx怎样才能获取到真实的ip呢?

反向代理:获取上一节的ip,一层一层会找到真实client的ip;

问题背景:

在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了nginx作为反向代理后,使用request.getRemoteAddr()获取到的就一直是nginx服务器的ip的地址,那这时应该怎么办?
part1:解决方案

我在查阅资料时,有一本名叫《实战nginx》的书,作者张晏,这本书上有这么一段话“经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过 r e m o t e a d d r 变 量 拿 到 的 将 是 反 向 代 理 服 务 器 的 i p 地 址 ” 。 这 句 话 的 意 思 是 说 , 当 你 使 用 了 n g i n x 反 向 服 务 器 后 , 在 w e b 端 使 用 r e q u e s t . g e t R e m o t e A d d r ( ) ( 本 质 上 就 是 获 取 remote_addr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取 remoteaddrip使nginx

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值