7

我有一个使用 Play 框架构建的小型站点,我试图在 EC2 服务器上针对 Amazon RDS 实例运行该站点。我可以在我的机器上针对 RDS 实例运行该应用程序,并且一切正常。但是当我将它部署到我的 EC2 服务器时,它会收到以下错误:

从服务器成功接收到的最后一个数据包是 1,282,977,731,085 毫秒前。最后一个成功发送到服务器的数据包是 0 毫秒前。
        在 play.db.DBPlugin.onApplicationStart(DBPlugin.java:87)
        在 play.Play.start(Play.java:381)
        在 play.Play.init(Play.java:247)
        在 play.server.Server.main(Server.java:85)
引起:java.net.ConnectException:连接被拒绝

我的第一个想法是它是某种安全设置,但我有一个基于 Spring 的应用程序在同一 EC2 服务器上的 Tomcat 中运行,使用相同的用户名和密码连接到同一个 RDS 实例,它工作得很好。只有 Play 应用存在连接问题。

我似乎无法对为什么会发生这种情况提出任何解释,或者关于如何解决它的想法。

以前有人见过这样的事情吗?

4

4 回答 4

2

问题出在 application.conf 文件上。如果您像这样指定本地数据库:

db=mysql:root:pass@db

和你的产品数据库是这样的:

%prod.db.url=jdbc:mysql://<your-db-ip>:3306/db
%prod.db.user=db_user
%prod.db.pass=db_pass

尝试在生产环境中运行时会出现此错误,因为 Play! 实际上是在尝试使用 db=mysql:root:pass@db 参数进行连接,因为 prod 参数不会专门覆盖该参数。要解决此问题,请务必在本地和 prod 中以相同的方式连接到数据库。这对我有用:

db.url=jdbc:mysql://localhost:3306/db
db.user=root
db.pass=pass

%prod.db.url=jdbc:mysql://<your-db-ip>:3306/db
%prod.db.user=db_user
%prod.db.pass=db_pass
于 2011-06-15T21:48:10.237 回答
0

我在这里问过同样的问题

Amazon RDS 和 Elastic Beanstalk 连接

在 RDS 默认安全组中添加“elasticbeanstalk-default”安全组后,您的问题很可能会得到解决

于 2011-06-14T06:11:59.300 回答
0

您的错误可能是由任何数量的事情引起的,并且似乎发生在协议堆栈的较低级别上,而不是您正在查看的内容。我建议在发送服务器上运行一个数据包分析器(例如wireshark)来尝试找出发生了什么。也许数据包没有到达那里?也许您的客户因为所处的环境不同而感到困惑?数据包嗅探器对于解开断开连接的奥秘非常有用。

如果您的服务器是无头的,或者您无法转发图形会话,您总是可以使用命令行工具,例如 *nix 系统上的 tcpdump。

于 2011-04-21T19:19:00.030 回答
0

我对这些框架(或一般的 Java)一无所知,但我对这两种亚马逊服务都有一些经验——这些框架是否有可能使用不同的协议或在不同的端口进行通信?如果是这样,它仍然可能是一个安全问题。

如果这是可能的,请转到 EC2 > Security Groups,如果您没有这三行,请尝试添加它们:

All | icmp | -1 |    -1 | default group
All | tcp  |  0 | 65535 | default group
All | udp  |  0 | 65535 | default group

(“默认组”是默认名称,我称之为我的,但您的组名可能不同——无论如何请确保它们是组名而不是“0.0.0.0/0”)

此外,如果您知道需要打开的特定协议/端口,那么显然也添加它们。

于 2011-01-25T15:53:48.557 回答