Spring Boot 应用程序在本地主机上运行,​​但在外部 Tomcat 上返回 404

Posted

技术标签:

【中文标题】Spring Boot 应用程序在本地主机上运行,​​但在外部 Tomcat 上返回 404【英文标题】:Spring Boot application runs on localhost but returns 404 on external Tomcat 【发布时间】:2021-07-15 07:05:24 【问题描述】:

我创建了一个带有 Spring Security 的 Spring Boot 应用程序来公开一些 REST API 端点。 我使用内置的 IntelliJ Ultimate Spring Initializr 创建了项目。

春季版:2.4.4 类型:Maven Java 版本:8 包装:战争

当我在 IntelliJ 中运行应用程序并启动 Tomcat 9.0.44 实例时。 然后,我使用 maven>package 创建了一个 WAR 文件,以在我的 PC 的本地 XAMPP 安装上进行测试。 (我使用的是 Tomcat 8.5.53。原因是这是我最终想要部署到的生产环境中可用的 Tomcat 版本。) 我使用 tomcat 管理器进行部署,它在那里运行也没有任何问题。 然后我将战争转移到我们的生产服务器并使用 Tomcat 管理器 UI 进行部署。 我可以在管理器中看到它已部署并且正在运行。生产服务器 Tomcat 管理器 UI

当我尝试使用 Postman 访问我的端点时,无论我尝试访问哪个端点,我总是会收到 404 错误...

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.apiauthentication</groupId>
    <artifactId>auth-server</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>
    <name>FLEET_Authentication_Server</name>
    <description>Authentication Server</description>
    <properties>
        <java.version>1.8</java.version>
        <jjwt.version>0.10.6</jjwt.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>$jjwt.version</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>$jjwt.version</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>$jjwt.version</version>
        </dependency>


        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.10</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>2.4.4</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>

        <finalName>$artifactId</finalName>
    </build>

</project>

主类-AuthServerApplication


@SpringBootApplication
public class AuthServerApplication 

    public static void main(String[] args) 
        SpringApplication.run(AuthServerApplication.class, args);
    

以下是 Tomcat 日志中的条目

catalina.log

21-Apr-2021 08:14:09.860 INFO [http-nio-8080-exec-2726] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/tomcat/webapps/auth-server.war
21-Apr-2021 08:14:11.828 INFO [http-nio-8080-exec-2726] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
21-Apr-2021 08:14:16.257 INFO [http-nio-8080-exec-2726] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /opt/tomcat/webapps/auth-server.war has finished in 6,397 ms

localhost.log

21-Apr-2021 08:14:11.839 INFO [http-nio-8080-exec-2726] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath
21-Apr-2021 08:14:13.419 INFO [http-nio-8080-exec-2726] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext

ma​​nager.log

21-Apr-2021 08:12:04.977 INFO [http-nio-8080-exec-2623] org.apache.catalina.core.ApplicationContext.log htmlManager: list: Listing contexts for virtual host 'localhost'
21-Apr-2021 08:14:09.806 INFO [http-nio-8080-exec-2726] org.apache.catalina.core.ApplicationContext.log HTMLManager: install: Installing web application '/auth-server' from '/tmp-war/auth-server.war'
21-Apr-2021 08:14:16.257 INFO [http-nio-8080-exec-2726] org.apache.catalina.core.ApplicationContext.log HTMLManager: list: Listing contexts for virtual host 'localhost'

localhost_access_log 文件中,我看不到我尝试访问新部署的应用程序的条目。

我尝试过的一些事情:

在我的主类上扩展 SpringBootServletInitializer 并覆盖配置方法
@SpringBootApplication
public class AuthServerApplication extends SpringBootServletInitializer 
    public static void main(String[] args) 
        SpringApplication.run(AuthServerApplication.class, args);
    

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
        return application.sources(AuthServerApplication.class);
    

在 pom.xml 的属性部分添加 start-class

    <properties>
        ...
        <start-class>
            com.apiauthentication.authserver.AuthServerApplication
        </start-class>
    </properties>
为 spring-boot-starter-tomcat 添加一个排除项到 spring-boot-starter-web
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
还有这些东西的不同组合

有人对可能是什么问题有任何提示吗? 基本上我可以在本地 XAMPP 上运行,但不能在生产服务器上运行

【问题讨论】:

访问日志中缺少条目似乎很奇怪。您确定您的生产服务器不在反向代理后面吗? 谢谢!问题与代理有关.... 服务器用于托管由 Plesk 管理的多个域。我必须进入域的 Apache 设置并设置新的 ProxyPass 和 ProxyPassReverse 指令。 【参考方案1】:

添加来自Piotr P. Karwasz 的评论作为答案。

访问日志中缺少条目似乎很奇怪。您确定您的生产服务器不在反向代理后面吗?

问题是我试图使用域名访问应用程序,但由于该域是使用 Plesk 管理的,并且该服务器上还有其他域,所以我必须转到该域的 Apache 设置并为 HTTP 和 HTTPS 添加一些新的 ProxyPass 和 ProxyPassReverse 指令

【讨论】:

以上是关于Spring Boot 应用程序在本地主机上运行,​​但在外部 Tomcat 上返回 404的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse 中从 Spring:boot 项目创建 war 文件

在本地主机上运行 VueJS 应用程序

如何在本地主机上启用 Spring 和 Angular 2 之间的 CORS

在本地主机上运行两个 grails 应用程序时如何解决跨域错误

为啥 spring-boot 应用程序无法在 AWS 中运行,但在本地运行良好?

Node.js 应用程序在本地主机上运行良好,但在 Heroku 上部署时显示错误