[英]Running a Phoenix application release with exrm crashes
我正在嘗試使用exrm
創建一個Phoenix
應用程序(基於Elixir和Erlang)的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 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
env)。
這部分:
{undef,[{'Elixir.Mix.Project',config,[],[]}
(非常Mix.Project.config/0
)錯誤消息基本上表示Mix.Project.config/0
未定義。 Mix不包含在發行版中,但我猜測Phoenix在其代碼重新加載器中使用它,您通常不會在生產中運行它。
嘗試使用MIX_ENV=prod
生成版本,看看它是否有效。
我把它放在問題跟蹤器中,但這里也是為了后人:
您需要添加server: true
到你prod.exs
的配置下MyApp.Endpoint
。 這就是鳳凰城在一個版本中開始的方式。
對於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
文件后,我能夠生成prod版本並執行console
, start
和ping
成功。 我懷疑熱代碼重新加載器可能是dev
構建中的罪魁禍首,但沒有證據排除它出現在錯誤中,並且肯定是dev
與prod
不同的東西。
順便說一下,在啟動應用程序時,你只需要指定PORT
,而不是MIX_ENV
因為這是一個發行版並且mix不在播放中:
PORT=4000 bin/my_app start
我的建議是跳過dev
構建,只使用staging
和prod
構建。 如果您沒有staging
服務器,則可以將staging
版本部署到本地計算機la https://exrm.readme.io/docs/deployment 。
每@bitwalker建議,采用master
分支exrm
固定的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.