我在 Apache httpd 服务器前面有一个负载平衡器,而该服务器又在运行 Tomcat6 的服务器前面。我们使用 Tomcat 来运行 Shibboleth 的 IdP。如下所示:
Client -> Load Balancer -> Apache httpd server (mod_proxy_ajp) -> Tomcat server
我希望将客户端的 IP 传递给 Tomcat 服务器。LB 将变量传递ClientIP
给 httpd 服务器,我可以在 httpd 的 LogFormat 中将其解析为"%{ClientIP}i"
,但这显然不会到达 Tomcat 服务器,而是 Tomcat 记录了 LB 的 IP。
我尝试使用 Tomcat 的 RemoteIpValve 作为(在server.xml
内部<Engine>
):
> <Valve className="org.apache.catalina.valves.RemoteIpValve"
> remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto"
> protocolHeaderHttpsValue="https" />
希望利用mod_proxy
会传递 IP 而X-Forwarded-For
无法成功。我看过 上的帖子mod_rpaf
,但我希望在不使用其他 apache httpd mods 的情况下做到这一点。
我认为我离把所有这些联系在一起只差几步之遥,但却陷入了困境。有什么想法吗?
答案1
如果负载均衡器将客户端 IP 地址插入名为 ClientIP 的标头中,mod_proxy 应将其传递给 Tomcat 服务器,而无需任何特殊配置。尝试配置 Tomcat RemoteIpValve 以查找客户端IP代替X-转发例如
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="ClientIP"
protocolHeaderHttpsValue="https" />