您的位置:

如何获取nginx客户端真实ip地址

在使用nginx作为web服务器时,我们有时需要获取到客户端的真实IP地址,这个问题可能会让我们感到困扰,因为客户端的真实IP地址并不是很好获取。下面,我们将从多个方面来探讨如何获取nginx客户端真实IP地址。

一、通过$remote_addr变量获取客户端IP

在nginx配置文件中,我们可以通过$remote_addr变量来获取客户端IP地址。这个变量不是nginx私有的变量,通常我们使用它来记录客户端IP地址。

location / {
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log;
    #获取客户端IP地址,使用$remote_addr变量
    add_header X-Real-IP $remote_addr;
}

在上面的配置中,我们通过add_header指令来设置X-Real-IP头部信息,将$remote_addr变量的值赋给X-Real-IP头部信息。

二、通过代理服务器获取客户端IP

在某些情况下,我们的nginx前面可能会有一个或多个代理服务器,而客户端的真实IP地址可能会被代理服务器隐藏掉,这时我们就需要通过代理服务器来获取客户端真实IP地址。

在代理服务器中,我们需要通过add_header指令来设置X-Real-IP头部信息。然后在nginx中,我们需要使用$proxy_add_x_forwarded_for变量来获取客户端IP地址。这个变量的值包括代理服务器的IP地址和客户端的IP地址。

#代理服务器配置
location / {
    proxy_pass http://backend;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#nginx服务器配置
location / {
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log;
    #获取客户端IP地址,使用$proxy_add_x_forwarded_for变量
    add_header X-Real-IP $proxy_add_x_forwarded_for;
}

在上面的配置中,我们在代理服务器中通过proxy_set_header指令来设置X-Real-IP和X-Forwarded-For头部信息,然后在nginx中,我们通过add_header指令将客户端IP地址写入X-Real-IP头部信息。

三、通过第三方模块获取客户端IP

除了上面两种方法,还有一种方法是通过第三方模块来获取客户端IP地址。其中比较流行的模块是realip和set-misc模块。

在使用realip模块时,需要在nginx配置文件中先加载该模块,然后在需要获取客户端IP地址的地方使用set_real_ip_from指令来设置代理服务器的IP地址,最后使用real_ip_header指令来设置客户端IP地址所在的头部信息。

load_module modules/ngx_http_realip_module.so;

http {
    realip_header X-Real-IP;
    set_real_ip_from 10.10.10.10;
}

在上面的配置中,我们先通过load_module指令来加载realip模块,然后在http模块中使用realip_header和set_real_ip_from指令。realip_header指令用来设置客户端IP地址所在的头部信息,set_real_ip_from指令用来设置代理服务器的IP地址。

另外一种方法是使用set-misc模块,该模块可以让我们更好地操作nginx的变量。在使用该模块时,我们可以通过ngx_http_set_real_ip_from和ngx_http_realip_header指令来设置代理服务器的IP地址和客户端IP地址所在的头部信息。

set $realip $remote_addr;
set_real_ip_from 10.10.10.10;
realip_header X-Real-IP;

在上面的配置中,我们先使用set指令创建了一个名为realip的变量,然后通过set_real_ip_from指令设置代理服务器的IP地址,最后使用realip_header指令来设置客户端IP地址所在的头部信息。

四、总结

通过以上几种方式,我们可以轻松地获取nginx客户端真实IP地址。在实际使用中,我们需要根据自己的实际情况,选择合适的方法来获取客户端IP地址。