nginx Stream模块代理tomcat获取真实客户端IP的解决方案
在使用Nginx Stream模块代理Tomcat时,获取客户端真实IP地址是一个常见难题。本文针对Nginx Stream模块代理Tomcat,并在Tomcat端获取真实客户端IP的情况,提供详细解决方案。
问题:用户尝试使用Nginx Stream模块(监听端口9000)代理Tomcat(监听端口8080),并启用proxy_protocol选项,希望Tomcat解析Nginx传递的真实客户端IP。Tomcat Connector也配置了proxyProtocol=”true”。然而,Tomcat无法正确解析PROXY协议报文,日志仅显示“proxy”前缀。
根本原因:Nginx Stream模块处理的是TCP协议,而非http协议。 Stream模块不解析HTTP请求头,无法像HTTP模块那样设置和传递X-forwarded-For等自定义头部信息。即使Nginx正确发送PROXY协议报文,Tomcat也无法通过其内置的proxyProtocol=”true”功能解析。
解决方案:将Nginx代理配置从Stream模块迁移到HTTP模块。HTTP模块允许使用proxy_set_header指令设置或修改请求头,将客户端真实IP信息传递给Tomcat。Tomcat应用随后即可读取这些自定义头部信息(例如X-Real-IP或X-Forwarded-For)获取真实IP。
迁移到HTTP模块后,才能确保Tomcat正确获取客户端真实IP地址。 这需要重新配置Nginx和Tomcat,利用HTTP协议的特性来解决TCP协议下无法传递HTTP头部信息的限制。