Node.js 快速应用生产部署

Node.js express application production deployment

假设我有一个 nodejs+express+mongodb Web 应用程序,现在我想使用 AWS EC2 机器 运行 linux 分发(我正在使用 ubuntu 服务器 14.04,你会使用不同的东西吗?)。

将像样的生产环境放入单层而不是我们通常在开发环境中使用的基本步骤是什么?

您会使用 http 服务器(nginx、apache、..)吗?您的防火墙配置是什么?在使用 public(nodejs 和 express 配置等)之前,您还会考虑什么?你会使用什么工具(例如永远)?您还会考虑哪些其他系统配置?

这个问题的重点不是性能,不考虑高水平的机器负载和应用扩展。

我已经在 AWS 上为多个商业应用程序实施了生产环境,最近使用的是 Node/Express/Mongo。通过大量调查、反复试验和编写一些脚本,我确定了适合我的配置。

下面是我使用的 services/utilities 的总结。按照设计,所有内容都可以广泛使用并有详细记录,因此您应该可以毫无问题地找到有关如何根据您的特定要求配置每个内容的讨论。

AWS 服务

  • EC2 安全组:主防火墙
  • ELB/Autoscaler(可选):负载均衡; add/remove 个基于负载的实例;启用 SSL
  • Cloudwatch:监控实例可用性
  • SNS:指定Cloudwatch告警的通知方式(e-mail/sms)

OS/Utilities

  • Ubuntu:最新的LTS版本,目前是14.04;配置为使用 cron/apt-get
  • 进行每周自动更新
  • nginx:反向代理到节点进程; 50 倍错误处理;服务 /public 个文件;如果不使用 ELB 则启用 SSL
  • Upstart:start/stop 应用程序需要维护;重生应用程序,如果它崩溃(ala forever);重启时启动应用程序
  • Monit:监控节点进程是否长时间中断(处理 upstart 重生失败);监视文件系统空闲 space;监控 mongo 进程

我使用标准的 apt-get 版本的 node、express 和 npm,没有特殊的配置设置。为了部署应用程序更新,我编写了一个 cron 脚本来检查 github 分支,因此通过提交到该分支会自动触发发布新版本。

当然还有更多的选择,但这些绝不是确定的……换句话说,YMMV。然而,根据我的经验,这些配置相当容易,工作可靠,让事情 运行 顺利进行,并迅速通知你 if/when 出现需要你注意的问题。

我最近 created/installed 一个使用 OpenShift 的 nodejs+express+mongodb 网络应用程序,它托管在 AWS 上。它是免费的,我目前只使用两个齿轮 (Mongo + web)。不必像我直接在 AWS EC2 上启动它们那样配置任何虚拟 firewalls/zones。

到目前为止,似乎对我来说很有效,而且比我之前在 AWS 控制台中处理的工作麻烦少了很多。

您应该使用 git 中描述的部署过程 http://nvie.com/files/Git-branching-model.pdf

对于生产环境,您还应该拥有格式正确且组织良好的配置文件,以便更轻松地进行部署。

使用Pm2模块集群,负载均衡,永远运行个不同的节点。

Apache 是一个很棒的服务器,您可以使用它。

我认为汤姆的回答很棒。除此之外,还有一些事情需要考虑。

MongoDB 在 AWS

托管 MongoDB 实例时需要进一步考虑一些事项。首先,您可能使用的是非常标准的 EBS 卷,但对于您的生产数据库而言,减少 EBS 涉及的延迟非常重要。 Mongodb 建议获取 EBS 优化实例,并使用具有预配置 IOPS 的 EBS 卷。

配置的 IOPS EBS 卷通常优于临时存储,因为当您销毁具有临时存储的实例时,您会丢失该数据。然而,EBS 与您的实例是分开的,并提供各种其他功能,这些功能可以方便地管理您的 mongodb 集群。尽管临时存储的性能可能更高,但您应该意识到如果删除该实例可能会丢失数据。

在为我的一个客户工作时,我曾与 MongoDB 的同事进行了短暂的合作,这让我获得了宝贵的经验,您绝对应该使用 MMS 来 manage/monitor 您的 mongoDB 实例。它是免费的,除非您想要备份,所以没有理由不这样做。 Monit 可能会监控您的系统,但不会监控或报告您的 mongoDB 集群的健康状况。

流程管理

Upstart 是保持节点可用性的好方法。然而,并不是每个人都擅长 编写新贵脚本。许多人编写了非常简单的新贵脚本。正如其他人所推荐的,PM2 是一个很棒的流程管理器。 PM2 将允许在部署时热重新加载您的应用程序,从而提供零停机部署。但回到主题,PM2 可以作为守护进程自行启动,并且 PM2 持久化您的部署,因此能够为您提供 upstart/init.d 提供的好处,您不必担心编写和测试新贵脚本。

一些额外的好处是 PM2 提供了自己的 REST api(可选)和 Web 界面来管理您的实例(重新加载、重启、停止、load/mem/cpu 等)。

编辑: 如果你是集群,PM2 只能热重载。主机上至少需要 2 个节点才能使用集群,并且每个节点都需要一个 CPU。这可能对您不利,但是您仍然可以使用 PM2 来启动您的应用程序。

内容分发和静态资产

您可能已经知道 its best not to server static assets with node。这通常是 Nginx 来拯救的地方。正如 Tom 在他的回答(50x 错误,SSL)中所述,Nginx 提供了其他好处。值得注意的是,AWS 为 CloudFront 提供了一个内容分发网络。虽然您可能无法将所有静态资产都放到云端,但值得在云端存储更大且不可压缩的文件(如图像),尤其是当您希望拥有大量移动用户时。这只会让您的内容更接近您的最终用户。

参考文献: