nginx Stream模塊代理tomcat獲取真實(shí)客戶端IP的解決方案
在使用Nginx Stream模塊代理Tomcat時(shí),獲取客戶端真實(shí)IP地址是一個(gè)常見難題。本文針對Nginx Stream模塊代理Tomcat,并在Tomcat端獲取真實(shí)客戶端IP的情況,提供詳細(xì)解決方案。
問題:用戶嘗試使用Nginx Stream模塊(監(jiān)聽端口9000)代理Tomcat(監(jiān)聽端口8080),并啟用proxy_protocol選項(xiàng),希望Tomcat解析Nginx傳遞的真實(shí)客戶端IP。Tomcat Connector也配置了proxyProtocol=”true”。然而,Tomcat無法正確解析PROXY協(xié)議報(bào)文,日志僅顯示“proxy”前綴。
根本原因:Nginx Stream模塊處理的是TCP協(xié)議,而非http協(xié)議。 Stream模塊不解析HTTP請求頭,無法像HTTP模塊那樣設(shè)置和傳遞X-forwarded-For等自定義頭部信息。即使Nginx正確發(fā)送PROXY協(xié)議報(bào)文,Tomcat也無法通過其內(nèi)置的proxyProtocol=”true”功能解析。
解決方案:將Nginx代理配置從Stream模塊遷移到HTTP模塊。HTTP模塊允許使用proxy_set_header指令設(shè)置或修改請求頭,將客戶端真實(shí)IP信息傳遞給Tomcat。Tomcat應(yīng)用隨后即可讀取這些自定義頭部信息(例如X-Real-IP或X-Forwarded-For)獲取真實(shí)IP。
遷移到HTTP模塊后,才能確保Tomcat正確獲取客戶端真實(shí)IP地址。 這需要重新配置Nginx和Tomcat,利用HTTP協(xié)議的特性來解決TCP協(xié)議下無法傳遞HTTP頭部信息的限制。