如何为组合的 HTTP/HTTPS 反向代理配置 JBoss EAP (6.4.x)?

How to configure JBoss EAP (6.4.x) for a combined HTTP/HTTPS reverse proxy?

我们的应用程序在 JBoss EAP 6.4 中运行。我们的开发设置在端口 8080 上以 HTTP 模式提供 JBoss 实例 运行,并提供具有 HTTP(端口 9090)和 HTTPS(端口 9443)端点的反向代理,以帮助测试不同的场景。

当我尝试通过将 UriInfo 注入我的请求处理程序来使用 "current" URL 时出现问题。内部 URI 的方案部分始终取决于 standalone.xml 中连接器设置的方案属性,而不取决于实际使用的方案。因此,例如,如果我在连接器的方案设置为 https 时调用 https://localhost:9443http://localhost:9090,则两个 URL 都将转换为 HTTPS,即 https://localhost:9443 而且https://localhost:9090。如果我将连接器的方案切换为 http,则两个 URL 都会更改为 HTTP。不用说了,X-Forwarded-Proto也忽略了。

有没有办法让 JBoss 的行为更像大多数其他应用程序服务器,即不对使用的环境做出任何假设,尤其是反向代理和负载平衡器?

RemoteIpValve 应该可以满足您的所有需求。

来自 JBossWeb 7.5.20 (EAP 6.4.20) 的源代码: http://anonsvn.jboss.org/repos/jbossweb/tags/JBOSSWEB_7_5_20_FINAL/src/main/java/org/apache/catalina/valves/RemoteIpValve.java

以下是上游 Apache Tomcat 7.0 项目网站上的更具可读性的文档: https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html

您的情况下的最低配置是网络子系统中的以下全局阀配置:

<valve name="remoteip-valve" module="org.jboss.as.web" class-name="org.apache.catalina.valves.RemoteIpValve">
    <param param-name="protocolHeader" param-value="X-Forwarded-Proto"/>
</valve>

这将根据 X-Forwarded-Proto header 的值设置方案。 对于 https,它还会将安全标志设置为 true 并将端口设置为 443。 由于您似乎需要将 HTTPS 端口设置为 9443,因此您可以通过额外的 httpsServerPort 参数来完成(而且我认为您还需要将 httpServerPort 设置为 9090,正如您提到的上面,因为 RemoteIpValve 否则会将其覆盖为 80),例如

<valve name="remoteip-valve" module="org.jboss.as.web" class-name="org.apache.catalina.valves.RemoteIpValve">
    <param param-name="protocolHeader" param-value="X-Forwarded-Proto"/>
    <param param-name="httpServerPort" param-value="9090"/>
    <param param-name="httpsServerPort" param-value="9443"/>
</valve>

如果需要,您可以使用该阀门做更多事情,只需查看文档了解更多详情。

此处也作了简单描述(需要 RH 登录):https://access.redhat.com/solutions/629863

顺便说一句,如果您能够使用 AJP 协议(​​从代理到应用程序服务器),那么就不需要这样做,因为 AJP 是为这些情况设计的,并且应该传输所有必需的信息到应用程序。服务器几乎透明。