使用反向代理在 Tomcat 子文件夹中部署 Java Web

Deploy Java Web in Tomcat Subfolder Using Reverse Proxy

我在将 Java Web 项目部署到 Tomcat 时遇到问题。

在localhost(开发环境)下,我可以部署成功。我可以通过访问 http://localhost:8080/project.

来访问该项目

我试图在服务器上部署它。当然,我可以使用 http://server_ip:8080/project 访问该项目。 如您所见,该项目位于 TOMCAT_HOME/webapps/project.

当我将它与由 Nginx 提供支持的反向代理一起使用时。这是 Nginx 的配置:

server {
    listen       80;
    server_name  example.com;

    location / {
        proxy_pass         http://127.0.0.1:8080/project;
    }
}

正常情况下,我可以使用http://example.com访问项目,nginx会获取http://127.0.0.1:8080/project中的内容。确实如此,但我无法获取静态文件。

我使用<c:url>标签加载静态文件:

<link rel="stylesheet" type="text/css" href="<c:url value="/assets/css/style.css" />" />

当我使用 http://server_ip:8080/project 访问网站时,一切正常。而 href 的值将是 /project/assets/css/style.css.

但是当我使用http://example.com访问网站时,href的值仍然是/project/assets/css/style.css,所以我会得到一个404错误。因为这个URL就是/project/project/assets/css/style.css。但是,该文件位于 /assets/css/style.css

谁能帮我解决这个问题?非常感谢。

尝试进行显式 location 匹配,如下所示:

server {
    listen       80;
    server_name  example.com;

    location ^~ /project {
        proxy_pass         http://127.0.0.1:8080/project;
    }

    location ^~ / {
        deny all;
    }
}

解释: location ^~ /project {}(注意:不适用于正则表达式)

^~ 导致请求开头区分大小写匹配。这意味着 /project/project/logo.jpg 等都将被匹配。这也会在匹配时立即停止位置扫描。

我使用以下配置解决了这个问题。

这是nginx.conf

server {
    listen       80;
    server_name  example.com;

    location ~ ^/(WEB-INF)/ {
        deny all;
    }

    location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|svg|eof|otf|ttf|woff) {
        root               /usr/local/tomcat/webapps/AppName/;
        expires            24h;
        access_log         off;
    }

    location / {
        proxy_pass         http://127.0.0.1:8080;
    }
}

这是 ${TOMCAT_HOME}/conf 中的 server.xml: (在Engine标签中添加以下内容)

<Host name="example.com" appBase="webapps/AppName"
        unpackWARs="true" autoDeploy="true">
    <Alias>www.example.com</Alias>

    <Context path="" docBase="${catalina.base}/webapps/AppName"
             reloadable="true" allowLinking="true">
    </Context>

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="appname_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>