Nginx获取用户真实IP

Nginx获取用户真实IP地址

本人在一次项目中,使用Nginx需要获取到用户IP,本来可以很常规的获取的,可现实往往不常规,项目是前后端分离的,部署时,前端使用了Nginx进行了代理并转发,后端也使用了Nginx进行了负载均衡和代理,分别部署在两台机器上,使用的不是同一个Nginx,所以此处当用户的请求过来时,先是通过前端Nginx转发到后端Nginx,后端Nginx再转发到具体的服务上,当时使用常规手法获取IP,结果获取到的是前端部署的机器IP。

在此本人通过了Nginx的realip模块进行了获取,特此来记录一下。

使用Nginx自带模块realip模块获取IP地址

首先来看看配置文件,此处只展示主要部分

http {
    include       mime.types;
    default_type  application/octet-stream;

    #access_log  logs/access.log  main;
	access_log off;
    error_log off;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
	#负载均衡配置 
    upstream serverCluster{
        server 127.0.0.1:82 weight=1;
        server 192.168.0.80:81 weight=1;
    }
	
    server {
        listen       80; #监听的端口
        server_name  yunque.natapp1.cc;
        
        #配置负载均衡
        location /{
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://serverCluster;
			set_real_ip_from  192.168.1.0/254;
			real_ip_header X-Real-IP;
			real_ip_recursive on;
            expires   3d;
        }
    }

}

set_real_ip_from  127.0.0.1; #这一网段过来的请求全部使用X-Real-IP里的头信息作为remote_addr
real_ip_header X-Real-IP;#从哪个header头检索出所要的IP地址
real_ip_recursive on; #开启

接下来就是测试配置是否正确

# 在Nginx安装目录下输入一下命令
./sbin/nginx -tc conf/nginx.conf

如果报一下错:

说第66行是未知的命令,表示当前Nginx没有相关realip模块,所以缺少该模块相关命令

下载realip模块并进行配置

 找到Nginx解压的目录,在该目录下输入以下命令

# 下载http_realip_module模块
./configure --prefix=/usr/local/nginx-1.4.1 --with-http_realip_module --原来有的模块(如果有的话)
# 查看Nginx版本号 (/usr/local/nginx/是你Nginx服务器的实际位置)
/usr/local/nginx/sbin/nginx -V

查看configure arguments:后边有没有值,如果有,就复制下来。

 配置完成后,运行命令make命令

make
# 注意,此处不能mark install 否则就是覆盖安装

替换已安装好的Nginx包

 替换之前先备份:

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

先停止Nginx服务 

# 停止服务
./usr/local/nginx/sbin/nginx -s stop

将刚刚编译好的nginx覆盖掉原有的nginx 

# 在Nginx解压目录下使用以下命令
cp ./objs/nginx /usr/local/nginx/sbin/

# 通过查看版本命令收看是否下载SSL模块成功
/usr/local/nginx/sbin/nginx -V

启动服务即可,命令如下

./usr/local/nginx/sbin/nginx
posted @ 2022-01-26 10:37  阿尔法哲  阅读(2643)  评论(0编辑  收藏  举报