模拟:客户端--F5--nginx--tomcat 后端获取用户真实IP
192.168.109.137 :nginx01(充当第一层代理==F5)
192.168.109.138 :nginx02(二层代理,业务转发)
192.168.109.139 :tomcat (后端业务层)
192.168.109.1 :客户端IP
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一。安装好访问如图:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二。配置代理查看效果,以及日志
1。 192.168.109.137 将所有请求代理到二级代理192.168.109.138去(proxy_pass http://192.168.109.138;)效果如下:
192.168.109.137:tail -f access.log
192.168.109.138:tail -f access.log
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三。设置日志打印格式,以及ip
1.一级代理192.168.109.137 nginx(F5)设置:
以下分别解释并测试效果:
1.proxy_set_header Host $host; 或者 proxy_set_header Host $host:$proxy_port; ($host代表转发服务器,$proxy_port代表137转发服务器请求后端服务器的端口,也就是80)
$host :$proxy_port指的的就是转发服务器【192.168.109.137 nginx(F5)】的servername 和监听端口,我这里配置的是listen 80;server_name 192.168.109.137;
在192.168.109.138的nginx日志打印中加入$http_host ‘ log_format main ‘....$http_host ‘
测试:
2.proxy_set_header X-Real-IP $remote_addr;
将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
一级代理nginx(F5)的日志配置:
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" $http_host ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
二级代理nginx02的日志配置如下:(两者区别在于"$http_x_real_ip",添加了这个变量的值)
log_format main ‘$remote_addr "$http_x_real_ip" - $remote_user [$time_local] "$request" "$http_host" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
继续测试:
3.proxy_set_header X-Forwarded-For $remote_addr; 与 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
两者的区别:
在只有一个代理服务器的转发的情况下,两者的效果貌似差不多,都可以真实的显示出客户端原始ip
但是区别在于:
$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。
继续测试:
一级代理nginx(F5)日志配置:
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" $http_host ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
二级代理nginx02日志配置:
log_format main ‘$remote_addr "$http_x_real_ip" - $remote_user [$time_local] "$request" "$http_host" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.二级代理192.168.109.137 nginx02设置:
set_real_ip_from 是指接受从哪个信任前代理处获得真实用户ip
real_ip_header 是指从接收到报文的哪个http首部去获取前代理传送的用户ip
real_ip_recursive on; #递归的去除所配置中的可信IP。排除set_real_ip_from里面出现的IP。如果出现了未出现这些IP段的IP,那么这个IP将被认为是用户的IP
注意:后端tomcat 一般是通过X-FORWARDED-FOR拿取客户端真实IP
tomcat日志打印配置:
vim server.xml
pattern="%{X-FORWARDED-FOR}i %h %l %u %t "%r" %s %b" />
pattern参数详解参考:http://sofar.blog.51cto.com/353572/1712069/
原文地址:https://www.cnblogs.com/NGames/p/12081752.html