本文解決使用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