续我的上篇博文:https://mp.csdn.net/postedit/89518574。即本篇博文是在上篇博文修改完之后的nginx.conf文件中进行修改的。(因为本篇博文在安装带有模块http_realip_module的nginx1.14服务时,并没有执行“make install”的操作,所以nginx.conf文件还是之前配置过的nginx.conf文件)
一、实验环境(rhel7.3版本)
1、selinux和firewalld状态为disabled
2、各主机信息如下:
主机 | ip |
---|---|
server1 | 172.25.83.1 |
二、安装带有模块http_realip_module的nginx1.14服务
前期准备:
- 停掉之前开启的nginx服务
- 清空缓存(删除之前安装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服务也就安装完成了。
三、nginx服务访问成功后返回200状态码
[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
四、获取nginx服务客户端对应的IP地址
[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地址
五、使用nginx自带模块realip获取用户IP地址
[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中)