Erlang/OTP生产应用程序部署简介

ska*_*tek 16 deployment erlang production erlang-otp mochiweb

我想在VPS上开发和部署Erlang/OTP应用程序.

我非常熟悉在本地机器上开发Erlang代码,我的问题是关于部署.

基本上,我想知道我应该采取哪些步骤将Erlang代码从本地机器移动到生产服务器并使其运行,即可供用户使用.

注意:我已经阅读了一些关于Erlang和命令行,Erlang 代码模块,Erlang 版本的文档,但我仍然不确定如何执行所需的任务.

但是,我想在服务器上部署基于Erlang的软件比sudo taskselLAMP做更棘手.

我计划有一个Erlang/OTP应用程序,它有Mochiweb,CouchDB(couchbeam)和boss_db作为依赖项.

所以,关于在生产服务器上部署所有内容的新手问题如下:

  • 我打算使用Ubuntu Server 12.04; 在生产中用于Erlang/OTP的Linux发行版有什么更好的选择吗?
  • 如何组织所有代码?我应该将我的应用程序放入/ home/myapp/dir然后将所有依赖项放入/ home/myapp/deps吗?或者我应该将所有依赖项放入/ usr/local/lib/erlang/lib?(由代码返回:get_path()).我应该以某种方式定期更新依赖关系还是应该冻结它们?
  • 一旦服务器启动,如何使整个应用程序启动?它应该是某种bash脚本还是其他什么?
  • 我知道Erlang允许热代码升级,但我应该如何组织呢?在Rails上,我可以使用git更新代码,在Erlang世界中是否存在类似的东西?

I G*_*ERS 10

有两种类型的依赖:内部和外部.如果你想以正确的方式(tm)这样做,那么上班需要一些时间:

外部依赖:

首先考虑后者,外部依赖是在应用程序运行之前必须运行的其他事情.例如PostgreSQL数据库或Riak集群.对于那些人,你通常只是使用Ubuntu中的常用内容来使其正常启动.我在使用monit这些任务方面有很好的经验:

http://mmonit.com/monit/

内部依赖性:

对于内部依赖项,您需要将程序安排到Erlang VM中的应用程序中.它们彼此依赖,就像外部依赖项一样.例如,您的主应用程序可能需要在它开始之前运行一个记录器.然后你创建一个版本.一个版本复制Erlang的二进制文件和必要的库/梁/应用到释放目录,形成了自成一体的Erlang系统.它包含一个引导脚本,它告诉如何以正确的顺序启动应用程序并使它们保持运行.因此,您可以将此版本tar-ball,将其复制到服务器然后启动它.这里有一些基础知识:

http://learnyousomeerlang.com/release-is-the-word

但是也要阅读应用程序之前的章节.您也可以rebar打电话reltool给您建立一个版本.这就是我通常做的事情.

热门升级:

处理生产中的热升级可以通过几种方式完成.您可以将光束移动到机器然后进行部署,获取外壳然后调用l(Module)以将其加载到正在运行的系统中.这适用于较小的修复程序.对于大型系统升级,您可以进行发布升级,即可在不停止服务的情况下即时升级运行系统.但是如果你的系统大部分都没有共享,那通常是不值得的.相反,您可以拥有多台计算机并按顺序升级它们.

例如,您可以升级计算机,然后使用像HAProxy这样的系统将所有请求的2%发送到新系统.然后系统地调高请求负载重量.

  • 我假设在现实世界中没有人将源代码推送到生产机器上来更新系统,但只是光束文件,对吗? (2认同)
  • 而"自包含的Erlang系统"是指发布了.beam文件,应该由安装了Erlang VM的生产机器执行? (2认同)

cho*_*ops 7

虽然@I给CRAP ANSWERS做了一个非常全面的总结,但我觉得有必要投入使用sync,这有助于自动化模块的热重编译和重新加载.

简单的方法是将sync指定为rebar依赖项,然后在准备部署升级时,可以sync:go()在Erlang节点上运行.这将启动同步引擎,该引擎会监视文件系统更改.然后你可以使用git推送到你的服务器.同步将注意文件更改,重新编译它们,并自动加载新光束.

然后,您可以立即运行sync:stop()告诉系统停止监视文件系统更改(通常不建议在实时服务器上保持同步运行,只是为了防止意外重新编译,如果由于某种原因,源文件发生更改而且是无意的.