1. 程式人生 > >使用nginx反向代理後,應用程式如何獲取使用者真實ip

使用nginx反向代理後,應用程式如何獲取使用者真實ip

最近,給部署應用網站的伺服器安裝了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" />