Вопрос

У меня есть небольшой сайт, который я создал с использованием платформы Play framework, который я пытаюсь запустить на сервере EC2 с экземпляром Amazon RDS.Я могу запустить приложение на своем компьютере с экземпляром RDS, и все работает нормально.Но когда я развертываю его на своем сервере EC2, он выдает эту ошибку:

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

Моей первой мыслью было, что это какая-то настройка безопасности, но у меня есть приложение на базе Spring, запущенное в Tomcat на том же сервере EC2, подключающееся к тому же экземпляру RDS с тем же именем пользователя и паролем, и оно работает просто отлично.Проблемы с подключением есть только в приложении Play.

Кажется, я не могу придумать никакого объяснения, почему это происходит, или идей о том, как это исправить.

Кто-нибудь видел что-нибудь подобное раньше?

Это было полезно?

Решение

Проблема с файлом 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

Вы получите эту ошибку при попытке бегать в производстве, потому что играйте! На самом деле пытается использовать db = mysql: root: pass @ db param к подключению, поскольку параметры продвижения не переопределяют этот параметр сестечно. Чтобы исправить это, обязательно подключитесь к DB таким же образом локально и в 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

Другие советы

Я ничего не знаю ни одинаковых из этих структур (или Java в целом), но у меня есть некоторое опыт с обоими этими услугами Amazon - возможно, возможно, что эти рамки обмениваются с использованием различных протоколов или в разных портах? Если это так, это все еще может быть проблемой безопасности.

Если это возможность, то перейдите в EC2> Группы безопасности, и если у вас нет этих трех строк, попробуйте добавить их:

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

(«Группа по умолчанию» - это имя по умолчанию, а то, что я позвонил, но имя вашей группы может быть разным - в любом случае убедитесь, что они являются названием группы, а не «0.0.0.0/0»)

Кроме того, если вы знаете о конкретных протоколах / портах, которые вам нужно открыть, то явно добавляю их.

Ваша ошибка может быть вызвана любым количеством вещей и, похоже, происходит на более низком уровне стека протокола, чем то, на что вы смотрите. Я рекомендую запустить анализатор пакетов (например, Wireshark) на отправке сервера, чтобы попытаться выяснить, что происходит. Может быть, пакеты не попадают туда? Может быть, ваш клиент мешает что-то из-за другой среды, в которой она находится? Сниффер пакета может быть бесценным для распутывания тайны диспятнансирования.

Если ваш сервер без головы, или вы не можете пересылать графическую сессию, вы всегда можете использовать инструмент командной строки, такой как TCPDUMP ON * NIX Systems.

Я уже задавал здесь тот же вопрос

Подключение Amazon RDS и Elastic Beanstalk

Скорее всего, ваша проблема будет устранена после того, как вы добавите группу безопасности "elasticbeanstalk-default" в группу безопасности RDS по умолчанию. добавьте группу безопасности "elasticbeanstalk-default" в группу безопасности RDS по умолчанию

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top