先介绍两个nginx模块
a、proxy_module
当本机的Nginx处于一个反向代理的前端时将用户真实IP转发至后端
b、http_realip_module
当本机的nginx处于一个反向代理的后端时获取到真实的用户IP
注:默认proxy_module
是会安装的,但是http_realip_module
则需要自己指定编译参数--with-http_realip_module
才会安装
一、Nginx获取真实IP
由于Nginx位于SLB后面,所以需要SLB监听设置中开启真实IP地址转发
SLB转发设置完成后Nginx需要接收获取真实IP(两层Nginx的配置也适用),这是要用到
http_realip_module
模块的功能,设置方法如下:
set_real_ip_from 192.168.0.0/24;(Nginx前面的负载均衡的ip段)
set_real_ip_from 192.168.0.1;(Nginx前面的负责均衡的IP地址)
real_ip_header X-Real-IP;(默认就好)
设置位置:http, server, location
这里如果前端只有一个Nginx或者SLB,可以不写ip段那行(实际情况中发现SLB到nginx的情况,即使不写这些设置Nginx日志也可以拿到用户的真实IP)
更多关于http_realip_module
请参考:http_realip_module或http_realip_module
二、tomcat获取真实IP
这里需要Nginx向tomcat转发用户真实IP
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;
这里其实有个很重要的点,如果Nginx的前端是四层负载的,如LVS,这里只能用$remote_addr获取真实IP,如果是七层负载,如Nginx,则可以用$http_x_forwarded_for来获取真实IP
# Forward the user's IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
配置好之后怎么看tomcat是不是可以拿到真实ip呢?
可以修改tomcat的localhost_acess输出的日志格式来查看配置是否成功
修改方法:修改tomcat配置文件server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
这个标签就是设置日志相关的,将这里修改为
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" />
或者
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%{X-Real-IP}i %h %l %u %t "%r" %s %b" />
修改完之后重启tomcat服务,然后tomcat的localhost_access日志中就会打印出两个IP,一个是客户的真实IP,一个是前端反向代理的NginxIP
115.238.*.* 192.168.*.* - - [30/Jan/2018:09:48:19 +0800] "GET /********* HTTP/1.0" 404 1023
115.238.*.* 192.168.*.* - - [30/Jan/2018:09:48:21 +0800] "GET /************** HTTP/1.0" 404 1023