2.6 反向代理

介绍

IdP 的服务发布,大致可以分为 Tomcat 直接发布,AJP 代理发布和 HTTP 反向代理发布三种。

什么是 AJP 代理?

AJPApache 提供的一种反向代理服务器的二进制协议。在 Apache 中通过 mod_proxy_ajp 模块发送 AJP 数据,另一端服务器——比如 Tomcat 则需要能够接受 mod_proxy_ajp 模块发送的 AJP 协议数据,进行交互。

由于 AJP 协议使用二进制传输方式,因此它比 HTTP 的文本传输方式更有效率。并且它能够直接向服务器端提供原始的 HTTP 头部信息,例如客户端 IP 地址等。

什么是 HTTP 反向代理?

更多时候,我们会通过更通用的 HTTP 协议来实现反向代理。此时,由于代理服务器向后端的真实服务器也是通过 HTTP 协议发送请求。因此默认情况下,后端服务器所获取到的客户端地址,均是代理服务器的地址;后端服务器获取到的请求协议,则是后端服务器所发布的协议。

例如我们通过反向代理服务器发布了一个 https://idp.example.org 这样一个网站,并做了 SSL 卸载,与后端服务器采用 http 协议通讯。那么默认情况下,后端服务器所获取的请求 url 均是 http://idp.example.org。这在 Shibboleth-IdP 的场景中会存在问题。

当客户端请求代理服务器的 https 服务时,他所产生的 cookie 中所记录的 url 信息也都是 https 的请求。而此时如果服务器端获取到的是 http 请求,则服务器会认为这个请求非法,从而报错。

因此,我们需要将真实的请求协议,和真实的客户端地址,通过插入 header 的方式,提供给后端服务器。

反向代理配置

反向代理服务器上,增加 X-Forwarded-ForX-Forwarded-Proto 两个 header 信息,传递真实的请求 IP 和真实的请求协议。

nginx 为例,其他反向代理的配置请咨询相关供应商获取技术支持。

      location /idp {
        proxy_pass      http://192.168.1.11:8080/idp;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
      }

tomcat 配置

在 tomcat 的 server.xmlEngine tag 中,增加下述配置。从而将传递给应用的客户端 ip 和请求协议替换为 X-Forwarded-ForX-Forwarded-Proto 中的值。

注意将 internalProxies 配置为您反向代理的内网地址。

    <Valve className="org.apache.catalina.valves.RemoteIpValve"
           internalProxies="192.168.1.14"
           remoteIpHeader="x-forwarded-for"
           protocolHeader="x-forwarded-proto"
    />
    </Engine>
  </Service>
</Server>

results matching ""

    No results matching ""