Nginx之服务端获取真实客户端IP

2,110 阅读1分钟

这是我参与8月更文挑战的第11天,活动详情查看: 8月更文挑战

服务端获取真实客户端IP,在日常项目中也常会出现这种需求,如果我们使用了反向代理服务,很有可能就在一些特殊的情况下就无法获取到真实的客户端IP;这个时候就需要我们在Nginx反向代理服务中加入一些配置来提供真实的客户端IP。

在配置之前,我们还要去讲一下Nginx中内置变量主要有哪些,分别有放置着什么样的值有什么样的作用。

nginx内置变量

$arg_name: 请求参数中的参数名称,如果?name=123,$arg_name取到的值就是name了。

$args: 请求参数中的参数值。

$content_length:请求头的content_length。

$content_type:请求头的content_type。

$cookie_name:cookie名称。

$hostname:主机名称。

$remote_addr:客户端地址,记住这个参数,一会我们就要用到了。

$remote_port:客户端端口。

$remote_user:用于http基础认证服务的用户名。

$request:代表客户端的请求地址。

$server_addr:服务器端地址。

$server_name:服务器端名称,例如域名。

$server_port:服务器端端口。

配置获取客户端真实IP

我们通常在Java后端获取客户端IP的方式是 request.getRemoteAddr(),但是如果我们使用了Nginx或者是其他的反向代理服务器。

就会导致这个方法取到的值不准确,甚至取不到,所以,我们就需要在反向代理服务器上做一些‘手脚’。

如何做呢,这时候就需要我们的nginx内置变量出场了,来看一下吧。

$remote_addr:客户端地址;

就是这个了,这个参数代表着你从客户端访问Nginx反向代理服务的地址,将这个参数传输给服务端就ok了。

配置如下:

server{
   
   .......这就不写了,只写重点。
   
   location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_pass http:www.test.com;
   
   }
   
}

如此配置的话,我们就可以在后台利用request.getHeader('X-Real-IP')来获取了;