Linux下安装带有模块http_realip_module的nginx1.14服务+用一台服务器模拟实现获取用户真实ip+nginx反向代理实现获取用户真实ip

续我的上篇博文:https://mp.csdn.net/postedit/89518574即本篇博文是在上篇博文修改完之后的nginx.conf文件中进行修改的。(因为本篇博文在安装带有模块http_realip_module的nginx1.14服务时,并没有执行“make  install”的操作,所以nginx.conf文件还是之前配置过的nginx.conf文件)

 

 

一、实验环境(rhel7.3版本)

 

1selinux和firewalld状态为disabled

2各主机信息如下:

主机ip
server1(nginx服务端)172.25.83.1
server2(nginx反向代理服务器)172.25.83.2

 

二、安装带有模块http_realip_module的nginx1.14服务

 

前期准备:

  1. 停掉之前开启的nginx服务
  2. 清空缓存(删除之前安装nginx服务生成的Makefile文件和objs目录)
[root@server1 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
configure arguments: --prefix=/usr/local/nginx   #我们可以看到之前安装的nginx1.14服务,并没有安装任何模块

[root@server1 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@server1 ~]# cd nginx-1.14.2/
[root@server1 nginx-1.14.2]# make clean
rm -rf Makefile objs

 

安装带有模块http_realip_module的nginx1.14服务

[root@server1 nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --with-http_realip_module   #预编译


[root@server1 nginx-1.14.2]# ls   #可以看到生成了Makefile文件和objs目录
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README      
[root@server1 nginx-1.14.2]# vim objs/ngx_modules.c   #在objs目录下的ngx_modules.c文件中可以查看安装好的模块
    &ngx_http_realip_module,   #可以看到有http_realip_module模块


[root@server1 nginx-1.14.2]# make   #编译


[root@server1 nginx-1.14.2]# cp objs/nginx /usr/local/nginx/sbin/nginx   #将生成的新的nginx二进制文件拷贝到/usr/local/nginx/sbin/目录下(覆盖之前该目录下的nginx文件)
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
[root@server1 nginx-1.14.2]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_realip_module   #可以看到安装时添加的模块

 

至此,带有模块http_realip_module的nginx1.14服务也就安装完成了。

 

 

我们访问互联网上的服务时,大多数时,客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理,反向代理再转发到服务端实现服务访问,通过反向代理实现路由/负载均衡等策略。这样在服务端拿到的客户端IP将是反向代理IP,而不是真实客户端IP,因此需要想办法来获取到真实客户端IP

                                                            客户端访问服务端的数据流走向
Client(172.25.0.1) --> ADSL( 192.168.0.1) --> cdn(10.0.0.1) --> SLB(反向代理)11.0.0.1 --> server(nginx)12.0.0.1

可以看出,服务端根本获取不到真实的客户端ip,只能获取到上一层服务的ip,那么nginx怎样才能获取到真实的ip呢?

 

三、用一台服务器模拟实现获取用户真实ip

 

1、nginx服务访问成功后返回200状态码(在nginx的服务端server1进行测试)

 

[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf   #在该配置文件的最后一个}(http模块中的})内编写如下128-135行的内容。136的}是http模块的}
128     server {
129         listen 80;
130         server_name server1.westos.org;
131 
132         location / {
133                 return 200;
134         }    
135     }
136 }


[root@server1 ~]# /usr/local/nginx/sbin/nginx   #修改完配置文件之后,启动nginx服务



[root@server1 ~]# vim /etc/hosts   #编辑本地解析文件
172.25.83.1     server1.westos.org


[root@server1 ~]# curl -I server1.westos.org   #进行测试
HTTP/1.1 200 OK   #我们可以看到这里返回了状态码200
Server: nginx/1.14.2
Date: Thu, 25 Apr 2019 09:42:56 GMT
Content-Type: application/octet-stream
Content-Length: 0
Connection: keep-alive

 

2、获取nginx服务客户端对应的IP地址(在nginx的服务端server1进行测试)

 

[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf   #将上面编写的内容的133行修改为如下的内容
128     server {
129         listen 80;
130         server_name server1.westos.org;
131 
132         location / {
133                 return 200 "client real ip: $remote_addr\m";
134         }   
135     } 
136 }


[root@server1 ~]# /usr/local/nginx/sbin/nginx -s reload   #修改完配置文件之后,重启nginx服务


[root@server1 ~]# curl  server1.westos.org   #在物理机编辑本地解析文件
client real ip: 172.25.83.1   #我们可以看到解析到了访问该域名的主机对应的ip地址

 

3、使用nginx自带模块realip获取用户IP地址(在nginx的服务端server1进行测试)

 

[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf   #添加131-133行的内容
128     server {
129         listen 80;
130         server_name server1.westos.org;
131         set_real_ip_from 172.25.83.1;
132         real_ip_header X-Forwarded-For;
133         real_ip_recursive off;
134         
135         location / {
136                 return 200 "client real ip: $remote_addr\n";
137         }       
138     }
139 }  


[root@server1 ~]# /usr/local/nginx/sbin/nginx -s reload   #修改完配置文件之后,重启nginx服务


[root@server1 ~]# curl -H "X-Forwarded-For: 1.1.1.1,172.25.83.1" server1.westos.org   #测试
client real ip: 172.25.83.1   #我们可以看到取到的ip地址是从右往左数的第一个ip地址
[root@server1 ~]# curl -H "X-Forwarded-For: 172.25.83.1,1.1.1.1" server1.westos.org   #测试
client real ip: 1.1.1.1   #我们可以看到取到的ip地址是从右往左数的第一个ip地址

 

[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf   #将上面编写内容的133行的off改为on
128     server {
129         listen 80;
130         server_name server1.westos.org;
131         set_real_ip_from 172.25.83.1;
132         real_ip_header X-Forwarded-For;
133         real_ip_recursive on;
134         
135         location / {
136                 return 200 "client real ip: $remote_addr\n";
137         }       
138     }
139 }  


[root@server1 ~]# /usr/local/nginx/sbin/nginx -s reload   #修改完配置文件之后,重启nginx服务

[root@server1 ~]# curl -H "X-Forwarded-For: 172.25.83.1,1.1.1.1" server1.westos.org
client real ip: 1.1.1.1   #获取到的是,除了配置文件中定义的172.25.83.1以外的地址
[root@server1 ~]# curl -H "X-Forwarded-For: 1.1.1.1,172.25.83.1" server1.westos.org
client real ip: 1.1.1.1   #获取到的是,除了配置文件中定义的172.25.83.1以外的地址
[root@server1 ~]# curl -H "X-Forwarded-For: 172.25.83.1,1.1.1.1,2.2.2.2" server1.westos.org
client real ip: 2.2.2.2   #获取到的是,除了配置文件中定义的172.25.83.1以外的从右往左数的第一个地址

 

参数解释:
1、
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
2、
real_ip_header:从哪个header头检索出要的IP地址
3、
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。

例如我这边的例子(该例子的前提是:real_ip_header的值为X-Forwarded-For),真实服务器获取到的IP地址串如下:120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
在real_ip_recursive on的情况下:如果61.22.22.22,121.207.33.33,192.168.50.121都出现在set_real_ip_from中,仅仅120.22.11.11没出现,那么它就被认为是用户的ip地址,并且赋值到remote_addr变量
在real_ip_recursive off或者不设置的情况下
从右往左数第一个ip地址即192.268.50.121就是用户的ip地址(不管该ip地址是否出现在set_real_ip_from中)

 

四、nginx反向代理实现获取用户真实ip

 

1、配置反向代理服务器

 

[root@server2 ~]# yum install gcc pcre-devel zlib-devel -y
[root@server2 ~]# tar zxf nginx-1.14.2.tar.gz 
[root@server2 ~]# cd nginx-1.14.2
[root@server2 nginx-1.14.2]# vim auto/cc/gcc
171 # debug
172 #CFLAGS="$CFLAGS -g"
[root@server2 nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --with-http_realip_module
[root@server2 nginx-1.14.2]# make && make install
[root@server2 nginx-1.14.2]# vim /usr/local/nginx/conf/nginx.conf   #在该配置文件的最后一个}(http模块中的})内编写如下117-126行的内容。127的}是http模块的}
117     server {
118         listen 80;
119         server_name www.westos.org;
120 
121         location / {   #该location模块表示当访问http://www.westos.org时,访问后端真实的服务器(http://172.25.83.1:80)
122                 proxy_set_header X-Real-IP $remote_addr;    #存放用户的真实ip
123                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   #每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里
124                 proxy_pass http://172.25.83.1:80;
125         }
126     }
127 }
[root@server2 nginx-1.14.2]# /usr/local/nginx/sbin/nginx

 

2、配置服务端

[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf   #在原先的server模块中添加42,43,44行的内容。下面其余的内容都是原先配置文件中自带的。
 39     server {
 40         listen       80;
 41         server_name  localhost;
 42         set_real_ip_from 172.25.83.0/24;
 43         real_ip_header X-Forwarded-For;
 44         real_ip_recursive on;
 45 
 46         #charset koi8-r;
 47 
 48         #access_log  logs/host.access.log  main;
 49 
 50         location / {
 51             root   html;
 52             index  index.html index.htm;
 53         }
[root@server1 ~]# cd /usr/local/nginx/html/
[root@server1 html]# vim test.html 
test
[root@server1 ~]# /usr/local/nginx/sbin/nginx -s reload

 

客户端测试

[root@foundation83 ~]# vim /etc/hosts   #编辑本地解析文件
172.25.83.2     www.westos.org
[root@foundation83 ~]# curl www.westos.org/test.html
test

 

服务端查看日志

[root@server1 html]# cat /usr/local/nginx/logs/access.log
172.25.83.83 - - [26/Apr/2019:14:09:24 +0800] "GET /test.html HTTP/1.0" 200 5 "-" "curl/7.29.0"

 

总结

1.使用realip模块后,$remote_addr输出结果为真实客户端IP,可以使用$realip_remote_addr获取最后一个反向代理的IP; 
2.real_ip_headerX-Forwarded-For:告知Nginx真实客户端IP从哪个请求头获取; 
3.set_real_ip_from 172.25.83.0/24:告知Nginx哪些是反向代理IP,即排除后剩下的就是真实客户端IP
4.real_ip_recursive on:是否递归解析,当real_ip_recursive配置为off时,Nginx会把real_ip_header指定的请求头中的最后一个IP作为真实客户端IP; 
当real_ip_recursive配置为on时,Nginx会递归解析real_ip_header指定的请求头,最后一个不匹配set_real_ip_from的IP作为真实客户端IP。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值