【问题标题】:Configure Tomcat8 behind Apache with HTTPS使用 HTTPS 在 Apache 后面配置 Tomcat8
【发布时间】:2019-05-15 22:28:34
【问题描述】:

我在服务器的 8080 端口上安装了 Tomcat 8,我正在使用安全的 Apache(使用 Proxy Pass)公开它。

这是我的 Apache 配置:

<VirtualHost *:443>
    ServerName myserver.com

    ProxyRequests Off
    ProxyPreserveHost On

    ProxyPass           /odata/    http://172.31.36.251:8080/
    ProxyPassReverse    /odata/    http://172.31.36.251:8080/

    <Proxy *>
        allow from all
    </Proxy>

    RequestHeader set X-Forwarded-Port 443
    RequestHeader set X-Forwarded-Scheme https
</VirtualHost>

这里是 Tomcat server.xml 配置

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443" 
            address="172.31.36.251" 
            proxyName="myserver.com" 
            scheme="https" proxyPort="443"  />

在此之前一切正常。如果我调用我的应用程序: https://myserver.com/odata/D3a1593adae89/odata.svc/

我明白了:

<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="https://myserver.com:443/D3a1593adae89/odata.svc/">
<workspace>
<atom:title>Default</atom:title>
<collection href="Maintables">
<atom:title>Maintables</atom:title>
</collection>
</workspace>
</service>

问题:如果在结果中看到属性xml:base,Tomcat用端口装饰地址,我真的不知道怎么去掉.地址也是错误的:应该是https://myserver.com:443/odata/D3a1593adae89/odata.svc/。我一直在环顾四周并尝试将 proxyPort 设置为空白但什么也没有。我认为这与使用 https://cwiki.apache.org/confluence/display/HTTPD/TomcatModProxyHTML 中所述的反向代理时断开的链接有关。我尝试了一些重写,例如:

ProxyHTMLURLMap http://172.31.33.105:8080 /odata
       RewriteEngine On
       RewriteRule ^/odata$ https://myserver.com/odata/ [R,L]

但我就是无法让它发挥作用。 xml:base 应该是https://myserver.com/odata/D3a1593adae89/odata.svc/

任何想法都值得赞赏

【问题讨论】:

    标签: https apache2 tomcat8 proxypass


    【解决方案1】:

    对于端口,当您使用ProxyPreserveHost On 并设置X-Forwarded-* 标头时,您可以使用RemoteIpValve

    <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" /> 
    

    连接器将是:

    <Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="443" 
                address="172.31.33.105" 
                 />
    

    阀门检测到proto,并假定连接使用默认端口号 (https://xxxxx/yyy) 保护。

    对于该位置,您应该在odata 上下文中部署您的应用程序,以便您可以使用

        ProxyPass           /odata    http://172.31.33.105:8080/odata
    

    修改代理传递的上下文(从 /odata/ 到 /)有点棘手,因为您需要过滤来自后端服务器的所有文本以修复某些 url 路径。真的很痛苦(我应该用“/odata/xxx”替换所有“/xxx”吗?)

    【讨论】:

    • 好的。我在哪里添加
    • 这是一个标准配置,所以在conf/server.xml文件中
    • 172.31.36.251 使用: 我得到:无法初始化组件 [Connector[HTTP/1.1-8080]] 看看我们将服务器改为 172.31.36.251
    • 我删除了 address="172.31.36.251" 因为 tomcat 在 Docker 中运行。这消除了错误,但我得到了相同的行为
    • 我刚刚看到你设置了RequestHeader set X-Forwarded-Scheme https,更“官方”的标题是RequestHeader set X-Forwarded-Proto https。它是阀门的protocolHeader上的on set。 (X-Forwarded-* 不是官方的,但它们曾经/现在很常见)
    猜你喜欢
    • 2018-07-09
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2017-04-08
    • 2018-11-15
    • 2012-12-06
    相关资源
    最近更新 更多