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

Deployment Erlang/OTP生产应用程序部署简介,deployment,erlang,production,otp,mochiweb,Deployment,Erlang,Production,Otp,Mochiweb,我想在VPS上开发并部署一个Erlang/OTP应用程序 我非常熟悉在本地机器上开发Erlang代码,我的问题是关于部署 基本上,我想知道我应该采取什么步骤,以便将Erlang代码从本地机器移动到生产服务器并使其运行,即供用户使用 注意:我已经阅读了一些关于Erlang模块、Erlang的文档,但我仍然不确定如何完成所需的任务 然而,我想在服务器上部署基于Erlang的软件比在服务器上执行sudo tasksel要复杂一些 我计划有一个Erlang/OTP应用程序,它具有Mochiweb、Cou

我想在VPS上开发并部署一个Erlang/OTP应用程序

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

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

注意:我已经阅读了一些关于Erlang模块、Erlang的文档,但我仍然不确定如何完成所需的任务

然而,我想在服务器上部署基于Erlang的软件比在服务器上执行
sudo tasksel
要复杂一些

我计划有一个Erlang/OTP应用程序,它具有Mochiweb、CouchDB()和as依赖项

因此,我的新手关于在生产服务器上部署所有这些东西的问题如下:

  • 我计划使用Ubuntu服务器12.04;Linux发行版是否有更好的选择用于生产中的Erlang/OTP
  • 所有代码应该如何组织?我应该将我的应用程序放入/home/myapp/dir,然后将所有依赖项放入/home/myapp/deps吗?还是应该将所有依赖项放入/usr/local/lib/erlang/lib?(由代码返回:get_path())。我应该定期更新依赖项还是冻结它们
  • 服务器启动后,如何启动整个应用程序?它应该是某种bash脚本还是其他什么
  • 我知道Erlang允许热代码升级,但我应该如何组织?在Rails上,我可以,Erlang世界中是否存在类似的东西
有两种类型的依赖关系:内部依赖关系和外部依赖关系。如果您想以正确的方式(tm)工作,则需要一点时间:

外部依赖关系: 首先考虑后一种情况,在应用程序运行之前,必须运行外部依赖关系。例如,PostgreSQL数据库或Riak集群。对于这些,你通常只需要使用Ubuntu中的常用工具就可以让它正常启动。我对使用
monit
执行以下任务有很好的经验:

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

但也要阅读前面关于应用程序的章节。您还可以通过
rebar
调用
reltool
来构建发布。这是我通常做的事

热升级: 在生产中处理热升级可以通过两种方式完成。您可以将梁移动到机器上,然后将其展开,取出外壳,然后调用
l(模块)
将其加载到正在运行的系统中。这适用于较小的修复。对于大型系统升级,您可以执行版本升级,这将在不停止服务的情况下动态升级正在运行的系统。但是如果你的系统基本上没有共享,那么它通常是不值得的。相反,您可以拥有多台计算机并按顺序升级它们


例如,您可以升级一台机器,然后使用HAProxy这样的系统将所有请求的2%发送到新系统。然后系统地增加请求的加载权重。

虽然@I GIVE CRAP ANSWERS给出了一个非常全面的总结,但我觉得必须使用,这有助于自动重新编译和重新加载模块

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


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

虽然这可能适用于较小的应用程序,但当存在大量具有混乱依赖关系的应用程序时,这是否有可能真的会造成混乱?(即,应用程序ups解决了什么问题?)对于较小的升级来说,这绝对是一个更简单的解决方案(“简单”有其缺点,主要是它不是一个全面的解决方案)。使用新应用程序进行重大升级,以及使用新的待升级应用程序,是的,您会希望使用更全面的应用程序。但对于将更改推送到不需要添加或升级依赖项的生产环境,这非常方便,而且不需要太多麻烦:只需推送代码,即可升级。也就是说,同步将根据需要升级rebar deps好的(基本上,erlang系统中加载的任何内容都会受到监控,以及源文件和beam文件的目录)。因此,执行类似于
rebar update deps
的操作也会热加载新的应用程序。当然,如果应用程序升级未能编译,那么您将处于不一致的状态(升级了一半dependecy应用程序),这显然不是一件好事。因此它可以实现这一点,但对于混乱的依赖关系层次结构来说,这不是最好的选择。看起来很有趣;我再看一看——我一直在使用mochiweb的reloader.erl,但将签出同步——很高兴为Simple替换所有的应用程序