Nginx Stream模塊代理Tomcat時,如何正確獲取客戶端真實IP地址?

Nginx Stream模塊代理Tomcat時,如何正確獲取客戶端真實IP地址?

nginx Stream模塊與tomcat真實IP地址獲取:常見問題及解決方案

在使用Nginx Stream模塊代理Tomcat時,正確獲取客戶端真實IP地址是一個常見挑戰。本文將分析問題根源并提供有效解決方案。

問題描述:

嘗試使用Nginx Stream模塊代理Tomcat,Nginx配置如下:

stream {     server {         listen 9000;         proxy_pass 127.0.0.1:8080;         proxy_protocol on;     } }

Tomcat connector配置也開啟了proxyprotocol:

<Connector connectionTimeout="20000" maxParameterCount="1000" port="8080" protocol="http/1.1" proxyProtocol="true" redirectPort="8443"/>

通過http://localhost:9000/xxx訪問應用,瀏覽器報錯,Tomcat訪問日志僅記錄代理前綴,缺少關鍵的客戶端IP、目標IP、端口信息。抓包顯示Nginx發送了包含proxy tcp4 ip1 ip2 端口1 端口2信息的報文,但Tomcat無法正常訪問。

問題分析與解決方案:

根本原因在于:Nginx Stream模塊處理的是TCP協議,而用戶試圖將其用于HTTP代理。Stream模塊并非設計用于解析HTTP請求,它主要用于TCP層代理,例如負載均衡。因此,在Stream模塊中使用proxy_protocol on無法讓Tomcat獲取客戶端真實IP。proxy_protocol需要與能夠解析HTTP請求的模塊(例如Nginx HTTP模塊)結合使用。

正確方法:使用Nginx HTTP模塊進行代理,并利用HTTP請求頭傳遞客戶端IP信息。

正確的Nginx配置應使用HTTP模塊,并設置相應的header:

http {     server {         listen 80;         location / {             proxy_pass http://127.0.0.1:8080;             proxy_set_header Host $host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-forwarded-For $proxy_add_x_forwarded_for;         }     } }

Tomcat端可以通過獲取X-Real-IP或X-Forwarded-For請求頭獲取客戶端真實IP。 多層代理情況下,X-Forwarded-For包含多個IP,需根據實際情況選擇合適的IP。

通過切換到Nginx HTTP模塊并正確設置HTTP headers,即可解決Tomcat無法獲取客戶端真實IP的問題,確保應用正常運行。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享