nginx获取客户端IP
环境
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
* epel: my.mirrors.thegigabit.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
配置二层代理,访问测试
[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;
}
}
配置一级代理测试
[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多级反向代理架构图
第四步. 利用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即可
查看本地IP地址
访问一级代理!
猜下二级代理的IP地址是谁?
再来确认下后端web服务器的地址
第六步.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地址
二层代理查看IP地址
web01的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地址