2010-08-28 138 views
7

我有一個使用Play框架構建的小型站點,我試圖在EC2服務器上針對Amazon RDS實例運行該框架。我可以在我的機器上運行RDS實例的應用程序,一切正常。但是,當我把它部署到我的EC2服務器它得到這個錯誤:使用Play框架EC2連接到RDS

 
The last packet successfully received from the server was 1,282,977,731,085 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. 
     at play.db.DBPlugin.onApplicationStart(DBPlugin.java:87) 
     at play.Play.start(Play.java:381) 
     at play.Play.init(Play.java:247) 
     at play.server.Server.main(Server.java:85) 
Caused by: java.net.ConnectException: Connection refused 

我首先想到的是它是某種安全設置的,但我必須連接到同一個EC2服務器上的Tomcat運行的基於彈簧的應用相同的RDS實例具有相同的用戶名和密碼,並且工作得很好。只有Play應用有連接問題。

我似乎無法得出任何解釋爲什麼會發生這種情況,或想法如何解決它。

之前有人看過類似的東西嗎?

+0

我說的「java」你的標籤列表中的情況下,這是一個特定於Java的問題。 – 2011-01-25 15:54:13

回答

2

問題添加「elasticbeanstalk默認」安全組與application.conf文件一起使用。如果您指定的本地數據庫是這樣的:

db=mysql:root:[email protected] 

和你督促DB這樣的:

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

你會嘗試在生產環境中運行,因爲玩的時候得到這個錯誤!實際上是試圖使用db = mysql:root:pass @ db param來連接,因爲prod params不會重寫那個參數。要解決此問題,請務必以本地和產品的相同方式連接到數據庫。這爲我工作:

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 
0

我不知道這兩種框架(或Java一般)的東西,但我確實有這兩種亞馬遜服務的一些經驗 - 這可能是可能的,這些框架通訊使用不同協議或不同的端口?如果是這樣,它可能仍然是一個安全問題。

如果這是一個可能性,然後去EC2>安全組,如果你不具備這三條線,嘗試將他們:

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

(「缺省組」是默認的名稱,我打電話給我的,但你的羣組名稱可能會有所不同 - 在任何情況下確保他們的組名,而不是「0.0.0.0/0」)

另外,如果你知道特定協議/端口的需要打開,然後顯然也添加它們。

0

你的錯誤是由許多事情引起的,似乎是在比你看什麼協議棧的較低水平發生。我建議在發送服務器上運行一個數據包分析器(例如wireshark)以試圖弄清楚發生了什麼。也許包沒有到達那裏?也許你的客戶混淆了一些東西,因爲它所處的環境不同?數據包嗅探器對於揭示錯誤連接的奧祕非常重要。

如果你的服務器是無頭的,也可以不轉發圖形會話,你總是可以使用命令行工具,如* nix系統tcpdump的。