使用exrm崩溃运行Phoenix应用程序版本

时间:2015-10-24 09:37:28

标签: release elixir phoenix-framework exrm

我正在尝试使用Phoenix创建一个库存exrm应用程序版本(基于Elixir和Erlang)。

dev混合环境的第一个版本创建正常,但在使用./rel/my_app/bin/my_app console运行时崩溃。这发生在Vagrant / Virtual Box虚拟机中运行Ubuntu 14.04。

在我的Mac上,相同的设置运行正常。不幸的是,我需要在与目标服务器具有相同架构的机器上构建版本,该服务器将运行Ubuntu。

您可以在此处找到该应用:https://github.com/mavenastic/my_app。它包括在VM上安装依赖项和创建项目所采取的步骤(请参阅STEPS.md)以及Erlang crash dump

以下是尝试运行控制台时出现的错误:

{"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运行正常。但是,我无法ping服务器,也无法在启动时运行远程控制台,因此应用程序运行正常似乎仍然缺少。

$ 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 个答案:

答案 0 :(得分:2)

对我而言,问题是您在dev环境中创建了该版本(而不是prod env)。

这部分:

{undef,[{'Elixir.Mix.Project',config,[],[]}
(非常令人敬畏的àlaErlang)错误消息的

基本上表示Mix.Project.config/0未定义。 Mix不包含在发行版中,但我猜是Phoenix在其代码重新加载器中使用它,你通常不会在生产中运行它。

尝试使用MIX_ENV=prod生成发布,看看它是否有效。

答案 1 :(得分:1)

我把它放在问题跟踪器中,但这也适用于后代:

您需要在server: true的配置下将prod.exs添加到MyApp.Endpoint。这就是凤凰城在一个版本中开始自我的方式。

对于Phoenix,我建议始终使用MIX_ENV=prod版本,MIX_ENV=dev有许多特定于开发的功能(例如代码重新加载),这些功能要么在发布中不起作用,要么赢了按预期工作。

如果您遇到配置错误,可能是因为您在环境特定文件中缺少一些必需的Phoenix配置。您可以通过运行MIX_ENV=prod mix compile来测试它,看它是否成功编译。您还可以使用--verbosity=verbose构建发布,以获取详细的输出以跟踪问题。

您无法ping或控制该版本的原因是因为它在启动时失败。

答案 2 :(得分:1)

@bitwalker是正确的,在@BatchSize文件中,您必须添加config/prod.exs la http://www.phoenixframework.org/v0.13.1/docs/advanced-deployment

我克隆了您的项目并生成了server: true版本,并且您遇到了同样的失败。我在dev版本的许多个人项目中遇到了同样的失败。但是,dev版本始终有效。

因此,在为prod添加了正确的信息并将config/prod.secret.exs添加到我的server: true文件后,我能够生成prod版本并执行{{ 1}},config/prod.exsconsole成功。我怀疑热门代码重新加载器可能是start构建中的罪魁祸首,但没有证据排除它出现在错误中,并且肯定是pingdev不同的东西。

顺便说一下,在启动应用程序时,您只需要指定dev,而不是prod,因为这是一个版本,混合不在播放中:

PORT

我的建议是跳过MIX_ENV版本,只使用PORT=4000 bin/my_app startdev版本。如果您没有staging服务器,则可以将prod版本部署到本地计算机la https://exrm.readme.io/docs/deployment

答案 3 :(得分:0)

根据@bitwalker建议,使用master exrm分支解决了问题。