以下所有的实操都是在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()(本质上就是获取 remoteaddr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反