记录下负载均衡+tomcat遇到的获取到错误scheme的坑
部署给客户的tomcat下的程序获取到的scheme始终是错误的
负载均衡使用的阿里slb,tomcat部署在阿里云centos7服务器上
浏览器到slb为https,slb到tomcat为http,已在slb上勾选传递 X-Forwarded-Proto
,tomcat上也已配置对protocolHeader
程序启动后获取到的scheme始终为http,抓包检查slb到tomcat的数据,也确实传递有 X-Forwarded-Proto: https
后来偶然发现通过slb获取到的scheme错误,而通过ssh做本地端口转发,相同数据包,走本地端口转发时,tomcat上能够获取到正确的scheme。本地端口转发时tomcat获取到的客户端ip为127.0.0.1,slb时tomcat获取到的ip为100.x.x.x。
动态调试tomcat,发现是internalProxies导致的,查询相关文档(https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/valves/RemoteIpValve.html)。发现需要配置 internalProxies。
默认情况下internalProxies为10/8, 192.168/16, 169.254/16, 127/8, 172.16/12, and ::1
internalProxies控制可信ip范围, 在该范围中的ip才会使用header中传递的X-Forwarded-Proto等数据