运行 带有 exrm 崩溃的 Phoenix 应用程序版本
Running a Phoenix application release with exrm crashes
我正在尝试使用 exrm
.
创建股票 Phoenix
应用程序(基于 Elixir 和 Erlang)的版本
dev
混合环境的第一个版本创建良好,但在 运行 使用 ./rel/my_app/bin/my_app console
时崩溃。这发生在运行ning Ubuntu 14.04 Vagrant/Virtual Box 虚拟机中。
在我的 Mac 上,同样的设置 运行 没问题。不幸的是,我需要在与目标服务器具有相同架构的机器上构建版本,这将 运行 Ubuntu.
您可以在此处找到该应用程序:https://github.com/mavenastic/my_app. It includes the steps taken to install dependencies and create the project on the VM (see STEPS.md
) as well as a 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
或任何其他环境创建一个版本。所以缺失的部分可能会影响两种环境。
提前致谢!
在我看来,问题在于您是在 dev
环境(而不是 prod
环境)中创建版本。
这部分:
{undef,[{'Elixir.Mix.Project',config,[],[]}
of the (terribly and awesomely à la Erlang) 错误消息基本上说 Mix.Project.config/0
是未定义的。 Mix 未包含在发行版中,但我猜 Phoenix 在其代码重新加载器中使用了它,您通常不会在生产中使用它 运行。
尝试使用 MIX_ENV=prod
生成版本,看看它是否有效。
我把它放在问题跟踪器中,但也只是为了后代:
您需要在 MyApp.Endpoint
的配置下将 server: true
添加到您的 prod.exs
。这就是 Phoenix 在一个版本中启动自己的方式。
对于 Phoenix,我建议始终使用 MIX_ENV=prod
发布,MIX_ENV=dev
有很多特定于开发的功能(例如代码重新加载),它们在发布中都不起作用,否则将无法按预期工作。
如果您收到配置错误,可能是因为您在特定于环境的文件中缺少一些必需的 Phoenix 配置。你可以通过 运行 MIX_ENV=prod mix compile
来测试它是否编译成功。您还可以使用 --verbosity=verbose
构建您的版本以获得详细的输出以追踪问题。
您无法 ping 或控制台到该版本的原因是它在启动时失败。
@bitwalker 是正确的,在你的 config/prod.exs
文件中你必须添加 server: true
a la 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
.[= 肯定存在一些不同之处34=]
顺便说一句,启动应用程序时,您只需指定 PORT
,而不是 MIX_ENV
,因为这是一个发行版,混音不在播放中:
PORT=4000 bin/my_app start
我的建议是跳过 dev
构建,只使用 staging
和 prod
构建。如果您没有 staging
服务器,您可以将 staging
版本部署到本地计算机,如 https://exrm.readme.io/docs/deployment.
根据@bitwalker 的建议,使用 exrm
的 master
分支解决了这个问题。
我正在尝试使用 exrm
.
Phoenix
应用程序(基于 Elixir 和 Erlang)的版本
dev
混合环境的第一个版本创建良好,但在 运行 使用 ./rel/my_app/bin/my_app console
时崩溃。这发生在运行ning Ubuntu 14.04 Vagrant/Virtual Box 虚拟机中。
在我的 Mac 上,同样的设置 运行 没问题。不幸的是,我需要在与目标服务器具有相同架构的机器上构建版本,这将 运行 Ubuntu.
您可以在此处找到该应用程序:https://github.com/mavenastic/my_app. It includes the steps taken to install dependencies and create the project on the VM (see STEPS.md
) as well as a 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
或任何其他环境创建一个版本。所以缺失的部分可能会影响两种环境。
提前致谢!
在我看来,问题在于您是在 dev
环境(而不是 prod
环境)中创建版本。
这部分:
{undef,[{'Elixir.Mix.Project',config,[],[]}
of the (terribly and awesomely à la Erlang) 错误消息基本上说 Mix.Project.config/0
是未定义的。 Mix 未包含在发行版中,但我猜 Phoenix 在其代码重新加载器中使用了它,您通常不会在生产中使用它 运行。
尝试使用 MIX_ENV=prod
生成版本,看看它是否有效。
我把它放在问题跟踪器中,但也只是为了后代:
您需要在 MyApp.Endpoint
的配置下将 server: true
添加到您的 prod.exs
。这就是 Phoenix 在一个版本中启动自己的方式。
对于 Phoenix,我建议始终使用 MIX_ENV=prod
发布,MIX_ENV=dev
有很多特定于开发的功能(例如代码重新加载),它们在发布中都不起作用,否则将无法按预期工作。
如果您收到配置错误,可能是因为您在特定于环境的文件中缺少一些必需的 Phoenix 配置。你可以通过 运行 MIX_ENV=prod mix compile
来测试它是否编译成功。您还可以使用 --verbosity=verbose
构建您的版本以获得详细的输出以追踪问题。
您无法 ping 或控制台到该版本的原因是它在启动时失败。
@bitwalker 是正确的,在你的 config/prod.exs
文件中你必须添加 server: true
a la 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
.[= 肯定存在一些不同之处34=]
顺便说一句,启动应用程序时,您只需指定 PORT
,而不是 MIX_ENV
,因为这是一个发行版,混音不在播放中:
PORT=4000 bin/my_app start
我的建议是跳过 dev
构建,只使用 staging
和 prod
构建。如果您没有 staging
服务器,您可以将 staging
版本部署到本地计算机,如 https://exrm.readme.io/docs/deployment.
根据@bitwalker 的建议,使用 exrm
的 master
分支解决了这个问题。