Nginx反向代理获取真实IP

今天面试官的一个问题让我有点疑惑:如何配置 Nginx 能让程序在后台获取真实的用户IP,当时我没理解这个问题意思,获取请求IP不是很简单的事情么?例如:request.getRemoteAddr()

回来查询了资料. 此问题是指使用了 Nginx 反向代理获取不到真实用户的 IP ,当使用了反向代理后 getRemoteAddr() 返回的是反向服务器的 IP。

什么是反向代理,曾经写了一个聊天小应用并部署再服务器上,端口为8888,本地访问也就是127.0.0.1:8888

我想让 t.imim.me 访问到我的这个应用上(应用已撤除),配置如下

t.imim.me

proxy_pass http://chat

这就是反向代理,将来自这个域名的请求转发到了一个名为 chat 的 upstream,也是真实的应用地址(127.0.0.1:8888)

再看这两行配置:

proxy_set_header X-real-ip $remote_addr
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

配置 X-real-ip 就可以在 web 服务器端通过 request.getAttribute(“X-real-ip”) 获得用户的真实 ip。

X-Forwarded-For 是一个 proxy 转发记录,每次经过转发都会有记录,以 client,proxy1,proxy2 格式保存。如果没有2配置的话,后端通过 request.getAttribute(“X-Forwarded-For”) 获取值为Null。

当一个应用经过 N(N>1) 次 Nginx 转发时,X-real-ip 中保存的是 N-1 的服务器地址,也就是说当第二次代理的时候 X-real-ip 的值为第一台 Nginx 服务器 IP,X-Forwarded-For 的值则变为”用户真实 IP , 第一台 Nginx 服务器 IP”