我想在VPS上开发和部署Erlang / OTP应用程序。
我非常熟悉在本地计算机上开发Erlang代码,我的问题是关于部署。
基本上,我想知道我应该采取哪些步骤将Erlang代码从本地计算机移动到生产服务器并使其运行,即可供用户使用。
注意:我已经阅读了一些关于Erlang and command line,Erlang code模块,Erlang releases的文档,但我仍然不确定如何执行所需的任务。
但是,我想在服务器上部署基于Erlang的软件比为LAMP执行sudo tasksel
更棘手。
我打算让一个Erlang / OTP应用程序将Mochiweb,CouchDB(couchbeam)和boss_db作为依赖项。
因此,我的新手关于在生产服务器上部署所有内容的问题如下:
答案 0 :(得分:10)
有两种类型的依赖:内部和外部。如果你想以正确的方式(tm)这样做,那么上班需要一些时间:
首先考虑后者,外部依赖是在应用程序运行之前必须运行的其他事情。例如PostgreSQL数据库或Riak集群。对于那些人,你通常只是使用Ubuntu中的常用内容来使其正常启动。我在使用monit
执行这些任务方面有很好的经验:
对于内部依赖项,您需要将程序安排到Erlang VM内的应用程序中。它们彼此依赖,就像外部依赖项一样。例如,您的主应用程序可能需要在它开始之前运行一个记录器。然后创建版本。 发布将Erlang二进制文件和必要的库/ beam /应用程序复制到发布目录中,形成一个独立的Erlang系统。它包含一个引导脚本,它告诉您如何以正确的顺序启动应用程序并使它们保持运行。因此,您可以将此版本tar-ball,将其复制到服务器然后启动它。这里有一些基础知识:
http://learnyousomeerlang.com/release-is-the-word
但是也要阅读应用程序之前的章节。您也可以rebar
致电reltool
来建立版本。这就是我通常做的事情。
可以通过多种方式处理生产中的热升级。您可以将光束移动到机器然后进行部署,取出shell,然后调用l(Module)
将其加载到正在运行的系统中。这适用于较小的修复程序。对于大型系统升级,您可以进行升级 - 升级,这将在不停止服务的情况下即时升级正在运行的系统。但是如果你的系统大部分都没有共享,那通常是不值得的。相反,您可以拥有多台计算机并按顺序升级它们。
例如,您可以升级计算机,然后使用像HAProxy这样的系统将所有请求的2%发送到新系统。然后系统地调高请求负载权重。
答案 1 :(得分:7)
虽然@I给CRAP ANSWERS做了一个非常全面的总结,但我觉得有必要投入使用sync,这有助于自动化热重新编译和重新加载模块。
简单的方法是将sync指定为rebar依赖项,然后在准备部署升级时,可以在Erlang节点上运行sync:go()
。这将启动同步引擎,该引擎会监视文件系统更改。然后你可以使用git推送到你的服务器。同步将注意文件更改,重新编译它们,并自动加载新光束。
然后,您可以立即运行sync:stop()
告诉系统停止监视文件系统更改(通常不建议在实时服务器上保持同步运行,只是为了防止意外重新编译,无论出于何种原因,源文件发生了变化,这是无意的。