使用nginx反向代理后,应用程序如何获取用户真实ip

时间:2022-08-28 12:10:15

最近,给部署应用网站的服务器安装了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" />