roc*_*BOO 11 elixir-mix elixir phoenix-framework
我有一些问题,拌匀,MIX_ENV=prod用mix phoenix.server,它失败的开始.在Linode的Ubuntu 14.04上运行所有最新的(Elixir 1.0.5,Phoenix 0.14.0),除了Erlang(17.x,17.3).
$ MIX_ENV=prod PORT=80 mix phoenix.server
{"Kernel pid terminated",application_controller,"{application_start_failure,elirc_site,{{shutdown,{failed_to_start_child,'Elixir.ElircSite.Endpoint',{shutdown,{failed_to_start_child,'Elixir.Phoenix.Endpoint.Server',{shutdown,{failed_to_start_child,{ranch_listener_sup,'Elixir.ElircSite.Endpoint.HTTP'},{shutdown,{failed_to_start_child,ranch_acceptors_sup,{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]},{supervisor,init,1,[{file,\"supervisor.erl\"},{line,243}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,306}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,239}]}]}}}}}}}}},{'Elixir.ElircSite',start,[normal,[]]}}}"}
Run Code Online (Sandbox Code Playgroud)
具体来说,我认为这部分是追踪.
{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]}
Run Code Online (Sandbox Code Playgroud)
看起来您的服务器正在尝试绑定到没有root权限的受限端口(小于1024).尝试使用更高端口,例如Phoenix的默认值4000.如果它需要在端口80上,要么以root身份运行,要么(更好)使用nginx代理它.
正如Nick Meharry指出你试图在传统上在Unix上的端口上运行Phoenix服务器进程,只有root可以绑定到(低端口(<1024)).
root出于安全原因,不建议运行您的进程- 接管该进程的攻击者可以获得对整个操作系统的root访问权限.
通过在高端口(例如,4000)上运行服务器并使用简单的iptables规则将连接从端口80转发到端口4000来解决此问题更安全.请注意,计算机上的任何用户都可以绑定到端口4000 - 所以你失去了低端口的额外保护.
另一个解决方案是允许某些程序(mix,elixir)使用可以使用的CAP_NET_BIND_SERVICELinux内核功能(自2.6.24开始提供)绑定到1024以下的端口setcap.但是,任何用户仍然可以使用此可执行文件,除非它们仅通过使用适当的文件访问权限对特定用户可用.
我看到以下选项:
我喜欢选项4.
要运行mix phoenix.server和类似命令,您需要setcap在BEAM二进制文件上运行.你可以通过简单地以root用户身份启动服务器来找到它ps -ef | grep beam.在我的系统上,它是/usr/lib/erlang/erts-8.1/bin/beam.smp,所以我运行:
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/lib/erlang/erts-8.1/bin/beam.smp
现在可以使用mix命令在普通端口上启动服务器.接下来,大概你会想要部署一个实际的elixir版本并将其作为服务运行.同样的策略也有效.setcap在run_erl您创建的版本的二进制文件上使用 对于我的应用程序,它是:
sudo setcap CAP_NET_BIND_SERVICE=+eip /home/ubuntu/myapp/_build/prod/rel/myapp/erts-8.1/bin/run_erl
现在,一个upstart或systemd脚本也可以启动服务器.
| 归档时间: |
|
| 查看次数: |
2188 次 |
| 最近记录: |