Nginx+tomcat 实现ip穿透
当http请求通过Nginx转发后web服务器获取的ip其实是Nginx的ip,而不是请求源头的ip.如何实现服务器能拿到且后台代码也能获取.
为什么会获取不到原有的ip???
因为nginx将请求的host给重定义了,就是说重定义的发送请求的位置,那么自然拿不到原有请求的ip地址,nginx会在默认的情况下重定义以下两个字段:
proxy_set_header Host
$proxy_host;proxy_set_header Connection close;
但是nginx支持重新定义或添加字段,用来传递给代理服务器的请求头.该值可以包含文本,变量和他们的组合.
那么我们就可以将原有的请求头信息通过定义新字段传递过去了.以下就是解决的方法:
1:nginx配置
格式 : proxy_set_header 字段名 字段值;
在Nginx的config文件中对应需要ip穿透的服务配置里添加以下配置信息:
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2:tomcat的log配置
Log的配置中将pattern设置成:
%{X-Real-IP}i %l %u %t "%r" %s %b"
3:后台代码获取(java)
Java中使用request来获取header中的对应的字段的值即可:
request.getHeader("X-Real-IP")