【问题标题】:Apache2 + Tomcat static resourcesApache2 + Tomcat 静态资源
【发布时间】:2018-08-27 18:13:08
【问题描述】:

我将 Apache2 设置为 Tomcat 的反向代理。我在 Tomcat 中的 server.xml 有下一个 AJP 配置:

<!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

Apache 的配置是:

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ProxyPreserveHost On
        SSLProxyEngine On
SSLEngine On
SSLCertificateFile /home/xxxxxx/store/f******.pem
SSLCertificateKeyFile /home/xxxxxx/p*******.pem
    # Servers to proxy the connection, or
    # List of application servers Usage
    ProxyPass / ajp://localhost:8009/x/
    ProxyPassReverse / ajp://localhost:8009/x/
    ServerName localhost
</VirtualHost> 

我的网络应用正在使用 Spring Security。 目前 Apache 服务页面(jsp)很好,但没有静态资源。不可能达到任何资源。 如果我放入浏览器

https://example.com/x/resources/img/logo.jpg

我看不到徽标。但是如果我把

https://example.com:8443/x/resources/img/logo.jpg

它出现了。

我们将非常欢迎任何帮助。

在此先谢谢大家 ;-)

【问题讨论】:

    标签: tomcat apache2 reverse-proxy


    【解决方案1】:

    您没有按照您想要的方式映射 URL。你有:

    ProxyPass / ajp://localhost:8009/x/
    

    这意味着/x 部分已经在 URL 中,并且在 Apache 之外是隐藏的。因此,如果您想要来自 Tomcat 的 /x/resources/img/logo.jpg,那么 URL 将是 Apache 之外的 http://hostname.tld/resources/img/logo.jpg

    如果您想在路径中维护/x,请将您的映射更改为

    ProxyPass / ajp://localhost:8009/
    

    这样/x就可以通过了。

    编辑

    为了清楚起见并防止大量 cmets,我将在 Tomcat 前面列出使用 Apache 的四种基本方法。

    1 - 纯粹通过。在这种情况下,您的 Apache 配置看起来像 ProxyPass / ajp://localhost:8009/(或 ProxyPass / http://localhost:8080/ 用于 HTTP 代理)。 Tomcat 实例获得的 URL 与 Apache 获得的完全相同。我用它来让 Apache 成为 SSL 端点,因为它更容易和更好地记录了如何在 Apache 上设置 SSL。通常在这种情况下只有一个 Tomcat 虚拟主机。

    2 - URL 重写(有点)。这就是你现在看到的。 Apache 配置看起来像 ProxyPass / ajp://localhost:8009/appName/。这允许您“隐藏”URL 的appName 部分。因此,如果外部用户请求 http://hostname.tld/blah.jpg 发送到 Tomcat 的 URL 是 /appName/blah.jpg 这种设置的唯一挑战是 Tomcat 端生成链接(即 HTML 锚标记)的代码需要注意不要生成一个包含 /appName 的 URL。在这种情况下,可能会有多个 Tomcat 虚拟主机与 Apache 虚拟主机并行。

    3 - Apache 提供静态资源。在这种情况下,您在 Apache 中的映射类似于 ProxyPass /dynamic ajp://localhost:8009/appName/。您可以通过 http://hostname.tld/dynamic/index.jsp 之类的方式请求 Tomcat 资源。您可以将静态资源移动到 Apache 可以访问它们的位置,并使用 URL 上的前缀(如 http://hostname.tld/static/picture.jpg)进行处理。这可以通过重写规则或其他 Apache 配置来实现。

    4 - 忘记 Apache。以可以绑定到端口 80(类 Unix 环境中的根用户)的用户身份运行 Tomcat,并且只提供来自 Tomcat 的所有内容。 SSL 设置起来有点麻烦,但它可以完成,并且可以通过几种方式消除 webapp 上下文(即/x),最简单的方法是将内容放在 Tomcat 的 ROOT 中。

    让我知道这是否有意义。

    【讨论】:

    • 嗨,stdunbar,感谢您的回答。我的应用程序在 /x 中运行。因此,据我所知,为了能够从 example.com 访问应用程序,我必须将 / 放在 Apache2 中,将 /x 放在 Tomcat 中。任何情况下,我都尝试过您的建议,但它不起作用。现在我在怀疑一些事情。通常 Apache 用于提供静态资源,也许这是标准行为?我的意思是,也许我必须配置 Apache2 来提供静态资源并将动态页面提供给 Tomcat。你怎么看?
    • 可以让 Apache 提供静态资源,但您不必这样做。如果你这样做了,那么你必须将/resources 之类的东西移动到Tomcat 无法为它们服务的地方。但是,如果您想“隐藏”/x,那么您只需按照我的指示更改外界使用的 URL。我想问题是你是否想要 URL 中的/x
    • 显然不能将 /x 添加到我的域名中。所以我猜你建议的方式暗示将我的应用程序移动到 Tomcat 中的 ROOT。我说的对吗?
    • 非常感谢,stdunbar,将我的应用程序移至 ROOT 成功了。无论如何,我还是不明白为什么在/x路由中,页面被服务了,而静态资源却没有,他们出现了添加8443
    • 如果在 #4 中没有建议以 root 身份运行,我会为此 +1。有多种方法可以让 tomcat 响应端口 80,但以 root 身份运行是一个建议,不得永远这样做。虽然我在这里:看起来“以root身份运行”和“命名应用程序ROOT”彼此相关 - 但它们绝对没有。我建议将 ROOT webapp 名称设置为第 5 点,以将其与在端口 80 上运行分开。
    猜你喜欢
    • 2014-01-11
    • 2016-04-30
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2022-12-04
    • 2013-08-01
    相关资源
    最近更新 更多