运行带有 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
文件后,我能够生成产品版本并执行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。
【讨论】:
感谢@jason-harrelson 提供的详细信息。在我最近的测试中,我只使用了prod
环境,所以我不确定它为什么仍然失败。使用exrm
的master
分支解决了这个问题。【参考方案4】:
根据@bitwalker 的建议,使用exrm
的master
分支修复了该问题。
【讨论】:
以上是关于运行带有 exrm 崩溃的 Phoenix 应用程序版本的主要内容,如果未能解决你的问题,请参考以下文章
使用纯 erlang OTP 代替带有 React.js 和 phoenix 框架的 elixir 后端
在数组排序行上单击带有 OnItemClickListener 的任何项目时应用程序崩溃
Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )
Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )