Node.js Express应用程序生产部署

问题描述 投票:2回答:4

假设我有一个nodejs + express + mongodb Web应用程序,现在我想使用运行Linux发行版的AWS EC2计算机上线(我正在使用ubuntu服务器14.04,您会使用其他功能吗?)。

将体面的生产环境分为一个层而不是通常在开发环境中使用的基本步骤是什么?

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

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

node.js express amazon-ec2 production-environment
4个回答
5
投票

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

以下是我使用的服务/实用工具的摘要。 通过设计,所有内容都可以广泛获得并有据可查,因此,您可以毫无疑问地找到有关如何将其配置为特定要求的讨论。

AWS服务

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

OS /公用事业

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

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

当然,还有更多选择,而这些绝不是确定的选择。换句话说,就是YMMV。 但是,以我的经验,这些配置非常容易,可以可靠地工作,保持运行平稳,并且在出现问题时(需要引起您的注意)迅速通知您。


1
投票

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

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来启动您的应用程序。

内容分配和静态资产

您可能已经知道最好不要使用node服务器静态资产 。 这通常是Nginx进行救援的地方。 正如Tom在回答中所说的那样,Nginx还提供了其他好处(50x错误,SSL)。 值得注意的是,AWS为CloudFront提供了内容分发网络。 尽管您可能无法将所有静态资产都放到Cloudfront上,但是值得在Cloudfront上存储较大且不可压缩的文件(例如图像),尤其是在您希望拥有大量移动用户的情况下。 这只会使您的内容更接近最终用户。

参考文献:


0
投票

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

到目前为止,似乎对我来说正在努力,并且比我先前在AWS控制台中苦苦挣扎的工作少了很多麻烦。


0
投票

您应按照http://nvie.com/files/Git-branching-model.pdf中所述使用git部署过程

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

使用Pm2模块进行群集,负载平衡并永久运行不同的节点。

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

© www.soinside.com 2019 - 2024. All rights reserved.