2010-08-28 9 views
7

Mam małą witrynę, którą zbudowałem za pomocą struktury Play, którą próbuję uruchomić na serwerze EC2 przeciwko instancji Amazon RDS. Mogę uruchomić aplikację na moim komputerze z instancją RDS i wszystko działa poprawnie. Ale gdy wdrożyć go do mojego serwera EC2 robi ten błąd:Połączenie EC2 z RDS przy użyciu struktury Play

 
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 

Moją pierwszą myślą było, że to jakiś rodzaj ustawień zabezpieczeń, ale mam aplikację opartą wiosnę z systemem w Tomcat na tym samym serwerze EC2 łączącego się ta sama instancja RDS z tą samą nazwą użytkownika i hasłem, i działa dobrze. Tylko aplikacja Play ma problemy z połączeniem.

Nie mogę wymyślić żadnego wyjaśnienia, dlaczego tak się dzieje, ani pomysłów, jak to naprawić.

Ktoś widział coś takiego wcześniej?

+0

Dodałem "java" do twojej listy tagów na wypadek, gdy jest to problem specyficzny dla java. –

Odpowiedz

2

Problem jest z plikiem application.conf. Jeśli podasz swój lokalny DB tak:

db=mysql:root:[email protected] 

i swoje prod DB takiego:

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

Dostaniesz ten błąd podczas próby uruchomienia produkcji, ponieważ Play! faktycznie próbuje użyć parametru db = mysql: root: pass @ db param do połączenia, ponieważ parametry prod nie przesyłają tego parametru osobno. Aby to naprawić, pamiętaj, aby połączyć się z DB w ten sam sposób lokalnie i w prod.To zadziałało dla mnie:

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

Nic nie wiem o żadnej z tych frameworków (lub ogólnie o Javie), ale mam pewne doświadczenie z obiema tymi usługami Amazon - może to być możliwe, że te struktury komunikują się za pomocą różnych protokołów lub w różnych portach ? Jeśli tak, może to być problem związany z bezpieczeństwem.

Jeśli jest to możliwe, a następnie przejść do EC2> Zabezpieczenia grup, a jeśli nie masz tych trzech linii, spróbuj dodać je:

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

(„grupa default” jest domyślną nazwą i co nazwałem moją, ale nazwa twojej grupy może być inna - w każdym razie upewnij się, że jest to nazwa grupy, a nie "0.0.0.0/0")

Ponadto, jeśli znasz konkretne protokoły/porty, których potrzebujesz otwarte, to oczywiście też je dodaj.

0

Twój błąd może być spowodowany przez dowolną liczbę rzeczy i wydaje się, że dzieje się na niższym poziomie stosu protokołów niż na tym, na co patrzysz. Zalecam uruchomienie analizatora pakietów (takiego jak wireshark) na serwerze wysyłającym, aby dowiedzieć się, co się dzieje. Może pakiety się tam nie dostają? Może twój klient miesza coś z powodu innego środowiska, w którym się znajduje? Sniffer pakietów może być nieoceniony dla wyjaśnienia tajemnicy dyskonekcji.

Jeśli serwer jest bez głowy lub nie można przesłać sesji graficznej, zawsze można użyć narzędzia wiersza polecenia, takiego jak tcpdump w systemach * nix.