最近,给部署应用网站的服务器安装了nginx,作为客户端和应用服务器之间的桥梁。对于Web应用来说,这次HTTP请求的客户端是Nginx而非真实的客户端浏览器,如果不做特殊处理的话,Web应用会把Nginx当作请求的客户端,获取到的客户端信息就是Nginx的一些信息。
现需要对Ngnix进行配置:
在代理的每个location处添加以下配置:
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_set_header X-Forwarded-Proto $scheme;
1.
Host
包含客户端真实的域名和端口号;
2.
X-Forwarded-Proto
表示客户端真实的协议(http还是https);
3.
X-Real-IP
表示客户端真实的IP;
4. X-Forwarded-For
这个Header和X-Real-IP
类似,但它在多层代理时会包含真实客户端及中间每个代理服务器的IP。
例如:
#主要是用于设置一组可以在proxy_pass和fastcgi_pass指令中使用额代理服务器,默认负载均衡方式为轮询
upstream tomcat_client {server 127.0.0.1:8080;
}
#开启gzip压缩,开启后,访问网页会自动压缩
#gzip on;
#指定服务器的名称和参数
server {
listen 80;
server_name http://;
location / {
proxy_pass http://tomcat_client;
proxy_redirect off;
#设置代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
发现改为上面的配置还是无法实现获取用户真实的ip。需对tomcat进行配置才能解决。
request.getHeader("X-Forwarded-For")
或request.getHeader("X-Real-IP")或request.getRemoteAddr()获取用户ip。
Tomcat作为应用服务器,可以通过配置Tomcat的server.xml文件,在Host元素内最后加入:即可
<Valve className="org.apache.catalina.valves.RemoteIpValve" />