Playframework 2.6: Как запустить производственную сборку без консоли?

Я использую Play Framework 2.6. После создания ZIP-файла производственной сборки с помощью

dist

В игровой консоли я использую этот код для запуска приложения на сервере.

my-first-app-1.0/bin/my-first-app -Dconfig.file=/path/to/config -Dplay.http.secret.key=$APP_SECRET

это запускает консоль, которая заканчивается:

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

после чего мой сервер продолжает работать отлично. Однако закрытие консоли (ctrl+C) или выход из окна терминала; ctrl+d тоже ничего не делает. Что мне здесь не хватает?

обновить

Итак, я просмотрел логи, но ровно ничего не происходит до выключения сервера.

2018-04-20 02:24:36,207 [INFO] from application in application-akka.actor.default-dispatcher-28 - <some benign application log>
2018-04-20 02:36:25,881 [INFO] from play.core.server.AkkaHttpServer in Thread-5 - Stopping server...
2018-04-20 02:36:25,940 [INFO] from application in application-akka.actor.default-dispatcher-41 - Shutting down connection pool.

Конечно, за это время мой терминал тоже отключился (опять же, мне кажется, что я запускаю свой сервер неправильно, посоветуйте, пожалуйста.)


person vortexkd    schedule 19.04.2018    source источник


Ответы (2)


Должен сказать, что у меня нет опыта работы на высшем уровне; но пара вещей здесь; относительно развертывания приложения Play:

  1. Отдельное приложение на физическом/виртуальном сервере: если вы хотите развернуть свое приложение на «голом железе»/экземпляре сервера и т. д. без каких-либо других фронтальных приложений, вам нужно запустить приложение на порту 80, а не 9000. Потому что вы хотите, чтобы ваши пользователи переходили на example.com, а не на example.com:9000.

  2. Отдельное приложение за http-сервером на физическом/виртуальном сервере: вы можете использовать https://www.playframework.com/documentation/2.6.x/HTTPServer (например, Nginx) и запустите приложение Play за ним. Таким образом, вы можете использовать интерфейсный http-сервер в качестве моста к вашему приложению. Фактически, вы можете использовать его в качестве балансировщика нагрузки для нескольких экземпляров приложения.

  3. Докеризация вашего приложения: на этот раз вы создаете образ докера из своего приложения и помещаете этот образ в систему управления контейнерами (например, Kubernetes). Затем вам нужно создать балансировщик нагрузки, который направляет трафик из общедоступного Интернета в вашу систему управления контейнерами.

  4. Развертывание облачных служб. Существуют также развертывания облачных служб. Например, в Heroku вы используете его плагин в качестве зависимости в вашем build.sbt; а затем вы вставляете свое приложение в его структуру, где позаботятся обо всем остальном.

Номер три, очевидно, является излишним для небольших команд; но это может быть решением вашей проблемы, где; вы не хотите ssh заходить на свой сервер и развертывать приложение Play. То же самое с номером четыре. Однако для номер один и два вы можете создать сценарий оболочки, который выполняется на основе определенных критериев (когда ваш сервер перезагружается) для выполнения сценария, связанного с воспроизведением; чтобы поднять заявку.

person o-0    schedule 19.04.2018
comment
Спасибо за совет! В настоящее время я использую сервер Apache, который прослушивает порт 80 и использует «VirtualHost» для маршрутизации трафика на сервер Play, который прослушивает порт 9000 (это один из способов, описанных в вашей ссылке) — однако после запуска сервера запускается консольный дисплей - и выход из него приводит к тому, что сервер перестает слушать. - person vortexkd; 19.04.2018
comment
@vortexkd, это совершенно нормально, если команда небольшая; а также не так много пользователей. Однако, если вы хотите сделать его масштабируемым (больше пользователей, больше операций чтения/записи в вашу базу данных и т. д.), вы можете рассмотреть другие варианты. - person o-0; 19.04.2018
comment
@vortexkd вы можете себе представить, есть ли проблема в вашем приложении, скажем, съела всю память из-за утечки памяти; затем вам нужно иметь дело с уничтожением/перезапуском/развертыванием и т. д. В системе управления контейнерами, такой как kubernetes, система управления выполняет уничтожение/перезапуск/развертывание образов в n экземпляров (на основе правил, определенных вами ), так что это стало намного более управляемым. - person o-0; 19.04.2018
comment
Я также думал, что это может быть проблема с памятью, но это не похоже (см. обновленный ответ), хотя я не исключаю этого полностью. Нет ли эквивалента play start в версии 2.6? Я все еще уверен, что это связано с консолью, поскольку выключение никогда не происходило, пока консоль подключена. - person vortexkd; 20.04.2018
comment
@vortexkd, как вы настроили свои журналы? Вы меняли его настройки? Потому что сейчас мы видим только уровень INFO. Возможно, изменить его на уровень DEBUG? Для запуска приложения как насчет sbt run? Разве это не покрывает ваш случай? Кстати, у меня была проблема с памятью, на самом деле это была утечка памяти; чтобы через некоторое время приложение потребляло 1,5 ГБ памяти вместо 500. Итак, вам нужно изучить жизненный цикл вашего приложения. Избавьтесь от любого блокирующего кода, если в этом нет необходимости; и введите свой ExecutionContext вместо использования контекста выполнения Global; если вы понимаете, о чем я. - person o-0; 22.04.2018
comment
Так что мне удалось решить проблему, начав играть внутри nohup следующим образом: nohup ~/myApp/bin/myApp -Dconfig.file=/path/to/conf -Dplay.http.secret.key=$SECRET & Я добавлю это в качестве ответа здесь - спасибо за вашу помощь! - person vortexkd; 23.04.2018
comment
@vortexkd не беспокойтесь, рад, что смог помочь. Агааа, все же вопрос решается линуксовой командой! Удачи. - person o-0; 23.04.2018

Моя проблема, похоже, действительно заключалась в том, что Play закрывался из-за консоли.

Мне удалось решить эту проблему, запустив игру с помощью nohup: nohup ~/myApp/bin/myApp -Dconfig.file=/path/to/conf -Dplay.http.secret.key=$SECRET &

person vortexkd    schedule 23.04.2018