运行带有 exrm 崩溃的 Phoenix 应用程序版本

Posted

技术标签:

【中文标题】运行带有 exrm 崩溃的 Phoenix 应用程序版本【英文标题】:Running a Phoenix application release with exrm crashes 【发布时间】:2015-10-24 09:37:28 【问题描述】:

我正在尝试使用 exrm 创建股票 Phoenix 应用程序(基于 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 或任何其他环境创建一个版本。所以缺少的部分可能会影响这两种环境。

提前致谢!

【问题讨论】:

【参考方案1】:

在我看来,问题在于您是在 dev 环境(而不是 prod 环境)中创建版本。

这部分:

undef,['Elixir.Mix.Project',config,[],[]

(非常和令人敬畏的 à la Erlang)错误消息基本上说 Mix.Project.config/0 未定义。 Mix 不包含在发行版中,但我猜 Phoenix 在其代码重新加载器中使用它,您通常不会在生产环境中运行它。

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

【讨论】:

感谢您的回答@whatyouhide。据我了解,我应该能够为dev 环境创建一个版本,请参阅here。我将尝试为prod 创建一个版本,并让您知道结果。【参考方案2】:

我把它放在问题跟踪器中,但也只是为了后代:

您需要在MyApp.Endpoint 的配置下将server: true 添加到您的prod.exs。这就是 Phoenix 在一个版本中的启动方式。

对于 Phoenix,我建议始终使用 MIX_ENV=prod 进行发布,MIX_ENV=dev 具有许多开发特定功能(例如代码重新加载),这些功能要么在发布中不起作用,要么无法作为预计。

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

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

【讨论】:

感谢@bitwalker。不幸的是,添加server: true 并不能解决问题。这可能是我想念的明显东西。我更新了问题on Github,找到解决方案后会更新这篇文章。 知道为什么不默认设置吗?【参考方案3】:

@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 文件后,我能够生成产品版本并执行consolestartping 成功。我怀疑热代码重新加载器可能是 dev 构建中的罪魁祸首,但没有证据排除它存在于错误中,并且肯定与 devprod 不同。

顺便说一句,在启动应用程序时,您只需要指定PORT,而不是MIX_ENV,因为这是一个发布版本,无法进行混音:

PORT=4000 bin/my_app start

我的建议是跳过dev 构建,而只使用stagingprod 构建。如果您没有staging 服务器,您可以将staging 版本部署到本地计算机,例如https://exrm.readme.io/docs/deployment。

【讨论】:

感谢@jason-harrelson 提供的详细信息。在我最近的测试中,我只使用了prod 环境,所以我不确定它为什么仍然失败。使用exrmmaster 分支解决了这个问题。【参考方案4】:

根据@bitwalker 的建议,使用exrmmaster 分支修复了该问题。

【讨论】:

以上是关于运行带有 exrm 崩溃的 Phoenix 应用程序版本的主要内容,如果未能解决你的问题,请参考以下文章

使用纯 erlang OTP 代替带有 React.js 和 phoenix 框架的 elixir 后端

在数组排序行上单击带有 OnItemClickListener 的任何项目时应用程序崩溃

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

尝试使用 axios 在 React/Phoenix 应用程序中进行 API 调用(使用早午餐)

带有 Phonegap 的 Android 应用程序在横向旋转时崩溃