5

我正在尝试Phoenix使用exrm.

混合环境的第一个版本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 故障转储

这是我尝试运行控制台时遇到的错误:

{"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

4 回答 4

2

对我来说,问题似乎在于您正在您的dev环境(而不是环境prod)中创建发布。

这部分:

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

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

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

于 2015-10-24T10:11:28.197 回答
1

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

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

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

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

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

于 2015-10-26T14:38:02.700 回答
1

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

我克隆了您的项目并生成了一个dev版本,并且遇到了与您相同的失败。dev我在构建的许多个人项目中都遇到了同样的失败。但是,prod构建始终仍然有效。

因此,在将 a 放入config/prod.secret.exs正确信息并将其添加server: true到我的config/prod.exs文件后,我能够生成一个 prod release 和 execute consolestart并且ping成功。我怀疑热代码重新加载器可能是dev构建中的罪魁祸首,但没有证据排除它存在于错误中,并且肯定dev与 vs不同prod

顺便说一句,在启动应用程序时,您只需要指定PORT,而不是MIX_ENV因为这是一个发行版,并且混合不在游戏中:

PORT=4000 bin/my_app start

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

于 2015-11-03T19:53:06.490 回答
0

根据@bitwalker 的建议,使用已修复问题的master分支。exrm

于 2015-11-24T08:01:13.663 回答