Apache2 + Tomcat 静态资源

Apache2 + Tomcat static resources

我将 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 安全性。 目前 Apache 可以很好地提供页面 (jsp),但没有静态资源。无法访问任何资源。 如果我在浏览器中输入

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

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

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

它出现了。

非常欢迎任何帮助。

提前谢谢你们 ;-)

您没有按照您想要的方式映射 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 就会通过。

编辑

为了清楚起见并防止出现大量评论,我将在 Tomcat.

前面列出使用 Apache 的四种基本方法

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

2 - URL 重写(某种程度上)。这就是你现在看到的。 Apache 配置看起来像 ProxyPass / ajp://localhost:8009/appName/。这允许您 "hide" URL 的 appName 部分。因此,如果外部用户请求 http://hostname.tld/blah.jpg,则发送到 Tomcat 的 URL 是 /appName/blah.jpg 此设置的唯一挑战是 Tomcat 端的代码生成 link(即 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。 运行 Tomcat 作为可以绑定到端口 80(类 Unix 环境中的根)的用户,并且只提供来自 Tomcat 的所有内容。设置 SSL 有点麻烦,但它可以完成,并且可以通过几种方式消除 webapp 上下文(即 /x),最简单的方法是将内容放在 ROOT 中 Tomcat.

让我知道这是否有意义。