环境

zabbix-mysql   ————->106.13.160.69  web01      百度云
zabbix-server  ————->139.9.186.7              web_proxy      华为云
Zabbix-agent   -----> 122.112.164.83 web——proxy 华为云
 
为啥要nginx反向代理,好处就是保障web集群安全,有最前端的nginx去接收用户的请求,而且是代理web集群的内网IP,我这里由于实例不在一个区就简单配置下!!!
 

第一步.三台机器安装nginx环境

 
[root@zabbix-server ~]# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
gpgcheck=0
enabled=1
scp到另外两台机器
[root@zabbix-server ~]# scp -rp  /etc/yum.repos.d/nginx.repo root@远程IP:/路径
[root@zabbix-server ~]# yum -y install nginx && nginx -v
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * extras: mirrors.cn99.com
 * updates: centos.cs.nctu.edu.tw
软件包 1:nginx-1.16.1-1.el7.ngx.x86_64 已安装并且是最新版本
无须任何处理
nginx version: nginx/1.16.1
 
PS:&&指前面命令执行失败后不执行后边的命令;
      ;   指的是前面命令无论成功还是失败都执行后面的命令;
 

第二步.nginx的index文件访问测试

 
[root@zabbix-mysql html]# echo "<h3>I am web01.</h3>" >index.html
 
 
nginx获取客户端IP
 
 
配置二层代理,访问测试
[root@zabbix-agent ~]# grep '^server' /etc/nginx/nginx.conf -A 10
server {
    listen 80;
    server_name _;
   
    location / {
        proxy_pass http://106.13.160.69:80;  
        include proxy_params;
    }
}
 
nginx获取客户端IP
 
 
配置一级代理测试
[root@zabbix-server ~]# grep '^server' /etc/nginx/nginx.conf -A 10
server {
    listen 80;
    server_name _;
   
    location / {
        proxy_pass http://122.112.164.83:80;   #代理的是二层代理的IP和端口
        include proxy_params;
    }
}
 
}
 
nginx获取客户端IP
 

第三步. nginx多级反向代理架构图

 
nginx获取客户端IP
 
 

 第四步. 利用nginx 两个模块获取IP地址

zabbix-server一层代理
[root@zabbix-server ~]# cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_connect_timeout 30;
proxy_http_version 1.1;
proxy_send_timeout 60;
proxy_read_timeout 60;
 
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
 
代理配置location时调用, 方便后续多个Location重复使用
 
server {
    listen 80;
    server_name _;
   
    location / {
        proxy_pass http://122.112.164.83:80;
include proxy_params;   include引用即可
 
    }
    }
 
 
zabbix-agent二层代理
[root@zabbix-agent ~]# cat  /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_connect_timeout 30;
proxy_http_version 1.1;
 
proxy_send_timeout 60;
proxy_read_timeout 60;
 
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
#proxy_next_upstream error timeout invalid_header http_500 http_404;
 
 
 
代理配置location时调用, 方便后续多个Location重复使用
server {
    listen 80;
    server_name _;
   
    location / {
        proxy_pass http://106.13.160.69:80;
        include proxy_params;    include引用即可
    }
}
 
 

第五步.获取用户端IP模块

 
需要在slb1/slb2的proxy_params文件中添加
proxy_set_header X-Real-IP $remote_addr;
在后端web01添加”$http_x_realip”重新加载nginx即可
nginx获取客户端IP
 
 
查看本地IP地址
nginx获取客户端IP
 
访问一级代理!
nginx获取客户端IP
 
 
猜下二级代理的IP地址是谁?
 
nginx获取客户端IP
 
 
 
再来确认下后端web服务器的地址
 
nginx获取客户端IP
 
 

第六步.X-Forwarded-For模块

 
上述看到了proxy_set_header X-Real-IP $remote_addr;模块获取客户端的IP结果,可以再利用另外一个模块看下效果proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;在slb1和2引用下即可。
 
[root@zabbix-server ~]# tailf /var/log/nginx/access.log
 
一层代理查看IP地址
nginx获取客户端IP
 
二层代理查看IP地址
 
nginx获取客户端IP
 
web01的IP地址
nginx获取客户端IP
 

第七步 两个模块的区别总结

 
 
 
proxy_set_header X-Real-IP $remote_addr;
在多级代理的情况下后端web集群只能获取到之后一级代理的IP地址,一级代理的情况下才能获取到用户的IP地址
 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
在多级代理下nginx的X-Forwarded-For模块可以获取到多级代理整个链路的IP地址