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

时间:2012-10-06 10:56:02

标签: deployment erlang production otp mochiweb

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

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

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

注意:我已经阅读了一些关于Erlang and command line,Erlang code模块,Erlang releases的文档,但我仍然不确定如何执行所需的任务。

但是,我想在服务器上部署基于Erlang的软件比为LAMP执行sudo tasksel更棘手。

我打算让一个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上我可以update the code with git,在Erlang世界中是否存在类似的东西?

2 个答案:

答案 0 :(得分:10)

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

外部依赖项:

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

http://mmonit.com/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()告诉系统停止监视文件系统更改(通常不建议在实时服务器上保持同步运行,只是为了防止意外重新编译,无论出于何种原因,源文件发生了变化,这是无意的。