Запуск релиза приложения Phoenix со сбоями exrm
Я пытаюсь создать выпуск акций Phoenix
приложение (на основе эликсира и эрланга) с использованием exrm
,
Первый релиз для dev
смешанная среда создается нормально, но вылетает при запуске с использованием ./rel/my_app/bin/my_app console
, Это происходит под управлением Ubuntu 14.04 внутри виртуальной машины Vagrant/Virtual Box.
На моем Mac такая же настройка работает нормально. К сожалению, мне нужно собрать релиз на машине с той же архитектурой, что и на целевом сервере, на котором будет работать Ubuntu.
Вы можете найти приложение здесь: https://github.com/mavenastic/my_app. Он включает шаги, предпринятые для установки зависимостей и создания проекта на виртуальной машине (см. STEPS.md
) а также аварийный дамп Эрланга.
Вот ошибка, которую я получаю при попытке запустить консоль:
{"Kernel pid terminated",application_controller,"{application_start_failure,my_app,{{shutdown,{failed_to_start_child,'Elixir.MyApp.Endpoint',{shutdown,{failed_to_start_child,'Elixir.Phoenix.CodeReloader.Server',{undef,[{'Elixir.Mix.Project',config,[],[]},{'Elixir.Phoenix.CodeReloader.Server',init,1,[{file,\"lib/phoenix/code_reloader/server.ex\"},{line,29}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,328}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,240}]}]}}}}},{'Elixir.MyApp',start,[normal,[]]}}}"}
РЕДАКТИРОВАТЬ:
Я попытался создать релиз для производственной среды, а также MIX_ENV=prod mix release
, Релиз успешно сгенерирован и MIX_ENV=prod PORT=8889 ./rel/my_app/bin/my_app console
работает нормально. Однако я не могу ни пропинговать сервер, ни запустить удаленную консоль, как только она запускается, так что кажется, что-то все еще не хватает для правильной работы приложения.
$ MIX_ENV=prod PORT=8889 ./rel/my_app/bin/my_app start
$ MIX_ENV=prod PORT=8889 ./rel/my_app/bin/my_app ping
=INFO REPORT==== 24-Oct-2015::10:28:25 ===
Protocol: "inet_tcp": register/listen error: econnrefused
escript: exception error: no match of right hand side value
{error,
{{shutdown,
{failed_to_start_child,net_kernel,
{'EXIT',nodistribution}}},
{child,undefined,net_sup_dynamic,
{erl_distribution,start_link,
[['my_app_maint_2551@127.0.0.1',longnames]]},
permanent,1000,supervisor,
[erl_distribution]}}}
$ ps aux | grep my_app
vagrant 2572 0.0 0.0 7532 96 ? S 10:28 0:00 /vagrant/my_app/rel/my_app/erts-7.1/bin/epmd -daemon
vagrant 2575 0.0 0.2 9448 2256 pts/0 S+ 10:28 0:00 grep --color=auto my_app
$ MIX_ENV=prod PORT=8889 ./rel/my_app/bin/my_app remote_console
$
Кроме того, из того, что я собрал, я должен быть в состоянии создать релиз для dev
или любая другая среда. Таким образом, недостающий фрагмент может повлиять на обе среды.
Заранее спасибо!
4 ответа
За предложение @bitwalker, используя master
филиал exrm
исправил проблему.
Мне кажется, проблема в том, что вы создаете релиз в своем dev
среда (вместо prod
окр).
Эта часть:
{undef,[{'Elixir.Mix.Project',config,[],[]}
сообщения об ошибке (ужасно и ужасно а-ля Erlang) в основном говорит, что Mix.Project.config/0
не определено Микс не включен в релизы, но я предполагаю, что Phoenix использует его в своем загрузчике кода, который вы обычно не запускаете в производстве.
Попробуйте сгенерировать релиз с MIX_ENV=prod
и посмотреть, если это работает.
@bitwalker правильно, в вашем config/prod.exs
файл, который вы должны добавить server: true
а-ля http://www.phoenixframework.org/v0.13.1/docs/advanced-deployment.
Я клонировал ваш проект и сгенерировал dev
отпусти и получаю ту же ошибку, что и ты. Я получил этот же сбой во многих моих личных проектах с dev
строить. Тем не менее prod
сборка всегда еще работает.
Таким образом, после введения в config/prod.secret.exs
с правильной информацией и добавлением server: true
к моему config/prod.exs
файл, я могу сгенерировать релиз prod и выполнить console
, start
а также ping
успешно. Я подозреваю, что перегруженный код может быть виновником dev
построить, но не иметь никаких доказательств, исключая его присутствие в ошибке и определенно что-то другое о dev
против prod
,
Кстати, при запуске приложения вам нужно только указать PORT
не MIX_ENV
так как это релиз и микс не в игре:
PORT=4000 bin/my_app start
Мой совет, чтобы пропустить dev
построить и просто использовать staging
а также prod
строить. Если у вас нет staging
сервер, вы можете развернуть staging
выпустить на локальный компьютер а-ля https://exrm.readme.io/docs/deployment.
Я поместил это в трекер, но и для потомков:
Вам нужно добавить server: true
на ваш prod.exs
под конфигом для MyApp.Endpoint
, Вот как Феникс начинает себя в релизе.
С Фениксом я бы рекомендовал всегда использовать MIX_ENV=prod
для релизов, MIX_ENV=dev
имеет множество специфических для разработки функций (таких как перезагрузка кода), которые либо не будут работать в рамках релиза, либо не будут работать так, как ожидалось.
Если вы получаете ошибки конфигурации, это может быть связано с тем, что вам не хватает необходимой конфигурации Phoenix в вашем файле для конкретной среды. Вы можете проверить это, запустив MIX_ENV=prod mix compile
чтобы увидеть, если он успешно компилируется. Вы также можете создать свой релиз с --verbosity=verbose
получить подробный вывод для отслеживания проблем.
Причина, по которой вы не можете пропинговать или утешить релиз, заключается в том, что он не запустился при запуске.