这是 Mozilla 身份团队的 A Node.JS Holiday Season 系列 中的第 12 集,总共 12 集。这是最后一部分,介绍了 awsbox。
在 Node.js 中编写服务器后,如何部署它?
Mozilla 的 身份团队 选择在 Amazon EC2 之上构建定制基础设施,而不是使用现有的“平台即服务”(PaaS)提供商,我们想向您详细介绍一下。
了解 awsbox,一个适用于 Node.js 应用程序的极简 PaaS 层,目前正在处理我们支持的近二十项非关键服务。
Awsbox 的设计目标是提供简单的 PaaS 风格部署,同时不牺牲定制基础设施的灵活性。
使用 awsbox
为了使用 awsbox 部署 Node.JS 项目,您必须对应用程序进行一些细微的更改,在环境中提供您的 Amazon 凭据,然后您就可以通过命令行进行部署。
在应用程序更改方面,您必须
- 创建一个
.awsbox.json
文件,指定如何启动服务器。 - 在您的
package.json
中添加awsbox
作为依赖项。 - 确保您的服务器绑定到
PORT
环境变量中指定的端口。
要提供您的 Amazon 凭据,您必须在环境中设置 AWS_ID
和 AWS_SECRET
,这两个值可以通过 Amazon 管理控制台 获取。
完成初始应用程序配置后,您可以 npm install
,这将安装 awsbox,然后您就可以创建第一个服务器了。
$ node_modules/.bin/awsbox create -n MyFirstAWSBOX
reading .awsbox.json
attempting to set up VM "MyFirstAWSBOX"
... VM launched, waiting for startup (should take about 20s)
... Instance ready, setting human readable name in aws
... name set, waiting for ssh access and configuring
... public url will be: http://
... nope. not yet. retrying.
... victory! server is accessible and configured
... applying system updates
... and your git remote is all set up
... configuring SSL behavior (enable)
Yay! You have your very own deployment. Here are the basics:
1. deploy your code: git push MyFirstAWSBOX HEAD:master
2. visit your server on the web: http://
3. ssh in with sudo: ssh ec2-user@
4. ssh as the deployment user: ssh app@
部署应用程序的最后一步是 git push
。
$ git push MyFirstAWSBOX HEAD:master
现在您的 Node.JS 应用程序已托管在 EC2 实例上并正在运行。此时,您在 awsbox 上花费了大约 20 分钟。您对应用程序进行了最小的更改。您已部署了一个新服务器,并让您的应用程序在 EC2 中启动并运行。最后,您获得了一种简单的方法来推送更改,它适合您现有的工作流程(您只需将 git push
推送到远程服务器)。
现在您已经了解了如何使用 awsbox 及其提供的一些基本功能,让我们退一步,看看它到底是什么,以及它是如何工作的。
awsbox 是…一个极简的契约
任何托管环境都对它将要运行的应用程序有一定的期望,即契约。对于 awsbox,此契约包括以下内容
应运行哪些进程由应用程序在 .awsbox.json
中指定。最简单的情况下,该文件可能如下所示
{
"processes": [ "path/to/myprocess.js" ]
}
必须安装哪些软件由应用程序在 package.json
中指定。
联系服务器的端口通过 PORT
环境变量传递给应用程序。
在构建 awsbox 时,主要目标是最小发明,使其易于“移植”现有应用程序。
awsbox 是…一个机器映像
在创建实例的过程中,awsbox 从“Amazon 机器映像”创建机器实例,从而生成一个运行服务器,该服务器已准备就绪,可以接受您的 node.js 应用程序,安装其依赖项,并运行它。该映像基于 Amazon Linux AMI 构建,该映像是 Amazon 提供的自定义 Linux 发行版,并可以通过 yum 访问流行的基于 RPM 的软件包存储库。awsbox AMI 的 ID 在 awsbox
JavaScript 库中引用。
此映像预配置了多个用户帐户。ec2-user
是一个拥有机器 sudo 访问权限的帐户。proxy
是一个托管 HTTP 反向代理 的帐户,该代理通过 一些步骤 可以用作 SSL 终止器,让您支持 HTTPS,而无需修改应用程序。最后,app
用户是托管所有应用程序代码、服务器日志、基于服务器的 Git 存储库(您将推送到该存储库)以及 Git 后提交钩子 的帐户,该钩子负责在您推送后安装依赖项并启动服务器。
awsbox 是…命令行工具和库
当您 npm install
awsbox 时,将安装一系列 JavaScript 库和命令行工具。命令行工具为您提供了比 Amazon 网络控制台更快的部署服务器方法,并处理了在 EC2 中创建可通过 SSH 和网络访问的实例的大部分复杂性。
awsbox
命令行工具还提供了许多命令行动词来执行 awsbox 的基本管理,可以使用 node_modules/.bin/awsbox -h
列出这些动词。
最有趣的动词是 create
,它实际上是创建虚拟机。
awsbox 是…一堆功能和钩子
最后,任何非平凡的服务器都需要比 Node.JS 服务更多的东西。为了支持未知情况,awsbox 允许您在实例创建时 指定应安装的 yum 软件包。对于更自定义的配置,您有两个选择
通过 SSH 登录并执行您需要执行的操作:awsbox 的目标是让您尽可能快地行动,有时,获得服务新实例的最便捷方法是手动执行所需的步骤并编写 README。但是,还有更可重复的解决方案可用…
编写脚本以自动为您配置软件:Awsbox 有 钩子概念,这些钩子发生在实例创建或部署的不同阶段。使用这些钩子,可以 配置 mysql,手动安装 redis,或者执行您需要执行的操作来启动服务。
awsbox 适合我吗?
拥有一个一致的部署非关键服务的机制,为我们的团队带来了巨大的效率优势。当您在应用程序和环境之间有一个简单且定义明确的契约时,协作会更容易。当您有一套一致的部署约定时,问题诊断会更快。最后,当应用程序的所有依赖项都明确表达时,从实验环境迁移到生产环境的成本更低。
如果您正在寻找自己的实验性 Node.JS 服务的部署解决方案,请仔细查看 awsbox 的理念和设计。
系列中的先前文章
这是 一个共 12 篇关于 Node.js 的系列文章 中的第十二部分。之前的文章是
- 追踪 Node.js 中的内存泄漏
- 全面加载 Node
- 使用安全的客户端会话构建简单且可扩展的 Node.JS 应用程序
- 出色的前端性能,第 1 部分 - 连接、压缩和缓存
- 构建一个不会熔化的 Node.JS 服务器
- 出色的前端性能,第 2 部分:使用 etagify 缓存动态内容
- 使用 node-convict 驯服配置
- 出色的前端性能,第 3 部分 - 通过优化字体获得巨大的性能提升
- 本地化您的 Node.js 服务,第 1 部分(共 3 部分)
- 本地化社区、工具和流程,第 2 部分(共 3 部分)
- 本地化实战,第 3 部分(共 3 部分)
关于 Robert Nyman [资深编辑]
Mozilla 技术布道师和 Mozilla Hacks 编辑。发表演讲和撰写有关 HTML5、JavaScript 和开放网络的博客文章。Robert 是 HTML5 和开放网络的坚定支持者,自 1999 年起一直从事 Web 前端开发工作 - 在瑞典和纽约市。他还定期在 http://robertnyman.com 撰写博客文章,喜欢旅行和结识新朋友。
3 条评论