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

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

nginx代理tomcat獲取客戶端真實IP的正確方法

本文解決使用Nginx代理Tomcat時,Tomcat無法獲取客戶端真實IP的問題。 問題表現為:使用Stream模塊代理后,Tomcat的訪問日志僅記錄“proxy”前綴,無法解析客戶端真實IP。

根本原因在于使用了錯誤的Nginx模塊。Stream模塊處理TCP協議,而http請求需要使用HTTP模塊。即使Stream模塊開啟了proxy_protocol on,Tomcat也無法在Stream模塊環境下正確解析Proxy協議。Stream模塊不處理HTTP請求頭,無法將客戶端IP信息傳遞給Tomcat。

解決方案:使用Nginx HTTP模塊

正確的解決方法是使用Nginx的HTTP模塊進行反向代理。HTTP模塊處理HTTP請求,并通過設置合適的請求頭,將客戶端真實IP傳遞給Tomcat。

以下示例配置展示了如何使用Nginx HTTP模塊:

http {     server {         listen 80;         location / {             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_pass http://127.0.0.1:8080/;         }     } }

此配置中,Nginx HTTP模塊將客戶端真實IP通過X-Real-IP請求頭傳遞給Tomcat。Tomcat無需修改proxyprotocol設置,可以直接從X-Real-IP請求頭獲取客戶端IP。后端應用代碼也需要讀取X-Real-IP請求頭獲取客戶端IP。 通過此方法,有效避免了Stream模塊在處理HTTP請求時的局限性,確保準確獲取客戶端真實IP。

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