0

我有一个简单的基于 Java servlet 的应用程序在 EC2 中的 tomcat 服务器的端口 8080 上运行。当我单击一个按钮时,它会返回数据库中的所有用户记录并将它们呈现到屏幕上。

当我使用 Tomcat 在本地主机上部署该应用程序时,该应用程序运行良好,并且它可以很好地连接从中检索用户记录的 RDS。

但是,当我将 WAR 文件部署到 EC2 实例上的 Tomcat 并通过 http://51 访问它时。. .***:8080/MyApp-0.0.1-SNAPSHOT,当我单击同一个按钮时,它不允许我连接到我的 RDS 并返回相同的对象。

EC2 和 RDS 实例共享相同的可用区、VPC(默认)和安全组。 我什至将 EC2 的私有 IP 地址添加到为 RDS 和 EC2 指定入站规则的安全组(入站:Postgres 5432 139... ***)。

我通过 AWS EC2 Instance Connect 连接到我的 EC2(不是通过我的本地主机上的 bash,因为 RDS 是一项托管服务)。我已经在 ec2 上安装了 maven、jdk8、tomcat 和 git ......我还需要安装 postgres 吗?

将war文件复制到var/lib/tomcat/webapps我运行应用程序后sudo service tomcat start,可以在我上面提到的地址的8080端口访问它。( http://51.***.***.***:8080/MyApp-0.0.1-SNAPSHOT)。

以下是 EC2 和 RDS 实例共享的安全组入站规则:

安全组入站规则

在允许 EC2 和 RDS 相互通信方面我做错了什么?

4

1 回答 1

1

弄清楚了。与安全组或 VPC 无关。有问题的基于 servlet 的应用程序正在使用 URL 重写来捕获发送到http://543.251.123/AppToDeploy/..的请求。

        final String URI = request.getRequestURI().replace("/AppToDeploy/", ""); 
        
        switch(URI) {
        case "login":
            RequestHelper.processLogin(request, response);
            break;
            ...

在 EC2 实例中,当我运行mvn clean package它时会生成一个名为 的 WAR AppToDeploy-0.0.1-SNAPSHOT.war,我将其传递到 Tomcat 的webapps/目录以在端口 8080 上提供服务。

修复方法是将以下内容添加到我的pom.xml文件中以重命名打包的 war 文件。

    <build>
        <!-- This renames the built war file -->
        <finalName>${project.artifactId}</finalName>
    </build>
于 2021-09-14T03:42:17.740 回答