一、通过$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地址。