【问题标题】:Node.js express application production deploymentNode.js 快速应用生产部署
【发布时间】:2015-05-19 19:39:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我的节点应用程序使用了 nginx,任何防火墙配置都使用了 iptables。我还确保 openssl 不会受到 heartbleed 攻击的影响。我使用 forever.js 来保持我的应用程序运行。对我来说似乎是一个很好的设置。

标签: node.js express amazon-ec2 production-environment


【解决方案1】:

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

以下是我使用的服务/实用程序的摘要。根据设计,所有内容都可以广泛使用并且有据可查,因此您应该可以轻松找到有关如何根据您的特定要求配置每个内容的讨论。

AWS 服务

  • EC2 安全组:主防火墙
  • ELB/Autoscaler(可选):负载均衡;根据负载添加/删除实例;启用 SSL
  • Cloudwatch:监控实例可用性
  • SNS:指定 Cloudwatch 警报的通知方法(电子邮件/短信)

操作系统/实用程序

  • Ubuntu:最新的 LTS 版本,目前为 14.04;配置为使用 cron/apt-get 每周自动更新
  • nginx:反向代理节点进程; 50x 错误处理;提供 /public 文件;如果不使用 ELB,则启用 SSL
  • Upstart:启动/停止应用程序进行维护;如果应用程序崩溃(永远阿拉),则重新生成应用程序;重启时启动应用
  • 监控:监控节点进程是否有长时间的中断(处理新贵重生失败);监视文件系统的可用空间;监控mongo进程

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

当然还有更多的选择,这些绝不是最终的选择......换句话说,YMMV。但是,根据我的经验,这些配置相当容易,工作可靠,让事情顺利运行,并且在出现需要您注意的问题时迅速通知您。

【讨论】:

    【解决方案2】:

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

    AWS 上的 MongoDB

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

    预置 IOPS EBS 卷通常比临时存储更受青睐,因为当您使用临时存储销毁实例时,您会丢失该数据。但是,EBS 与您的实例是分开的,并提供了各种其他功能,可以方便地管理您的 mongodb 集群。尽管临时存储的性能可能会更高,但您应该注意如果删除该实例可能会丢失数据。

    在为我的客户工作期间,我曾与 MongoDB 的人一起工作过很短的时间,因此您绝对应该使用 MMS 来管理/监控您的 mongoDB 实例。它是免费的,除非你想要备份,所以没有理由不这样做。 Monit 可能会监控您的系统,但不会监控或报告您的 mongoDB 集群的运行状况。

    流程管理

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

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

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

    内容分发和静态资产

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

    参考资料:

    【讨论】:

      【解决方案3】:

      我最近使用 OpenShift 创建/安装了一个 nodejs+express+mongodb Web 应用程序,它托管在 AWS 上。它是免费的,我目前只使用两个齿轮(Mongo + web)。无需像直接在 AWS EC2 上启动它们那样配置任何虚拟防火墙/区域。

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

      【讨论】:

        【解决方案4】:

        您应该使用 git 部署过程,如 http://nvie.com/files/Git-branching-model.pdf

        对于生产,您还应该有格式良好且组织良好的配置文件,以使部署更容易。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-11
          • 1970-01-01
          • 1970-01-01
          • 2012-09-21
          • 1970-01-01
          • 2012-01-13
          • 1970-01-01
          相关资源
          最近更新 更多