18

我想在 VPS 上开发 Erlang/OTP 应用程序并将其部署到生产环境中。

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

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

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

但是,我想在服务器上部署基于 Erlang 的软件比在LAMPsudo tasksel上部署要复杂一些。

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

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

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

2 回答 2

12

有两种类型的依赖:内部和外部。如果您想以正确的方式进行操作(tm),则需要一些时间才能开始工作:

外部依赖:

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

http://mmoni.com/monit/

内部依赖:

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

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

但也请阅读之前关于应用程序的章节。你也可以rebar打电话reltool让你构建一个版本。这是我通常做的。

热升级:

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

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

于 2012-10-06T14:32:35.583 回答
8

虽然@I GIVE CRAP ANSWERS 给出了非常详尽的总结,但我觉得不得不使用sync,这有助于自动化模块的热重新编译和重新加载。

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

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

于 2012-10-07T01:10:59.850 回答