如何使用多核,反向代理和SSL在云中部署Node.js以实现高可用性

Chr*_*s F 46 deployment node.js

我已将此发布到ServerFault,但Node.js社区似乎很小,所以我希望这会带来更多曝光.

我有一个Node.js(0.4.9)应用程序,正在研究如何最好地部署和维护它.我想在云端(EC2或RackSpace)以高可用性运行它.该应用应该在HTTPS上运行.稍后我会担心East/West/EU完全故障转移.

我已经做了大量关于keep-alive(Upstart,Forever),多核实用程序(Fugue,多节点,Cluster)和代理/负载均衡器(node-http-proxy,nginx,Varnish和Pound)的阅读.但是,我不确定如何结合我可用的各种实用程序.

我有这个设置,需要解决一些问题并获得反馈.

  1. Cluster是Node.js中最活跃且看似流行的多核实用程序,因此使用它在非特权端口(比如3000)上为每个应用服务器运行1个节点"集群".Q1:应该永远被用于保持集群活着还是只是多余的?
  2. 使用1个nginx的每端口80上运行的应用程序服务器,只需反向代理在端口3000节点Q2:请问节点-HTTP代理更适合,即使它不会很快gzip压缩或服务器静态文件这个任务?
  3. 如上所述,拥有最少2x的服务器,独立服务器充当这些盒子的负载均衡器.使用Pound listen 443终止HTTPS并将HTTP传递给Varnish,这将在上面的服务器的IP上循环负载平衡.问题3:是否应该使用nginx代替两者?问题4:是否应考虑使用AWS或RackSpace负载均衡器(后者不会终止HTTPS)

一般的问题:

  1. 你认为上面有(2)的需要吗?
  2. 终止HTTPS的最佳位置在哪里?
  3. 如果将来需要WebSockets,你会做出哪些nginx替换?

我真的很想知道人们如何建立当前的生产环境以及他们喜欢哪种工具组合.非常感激.

Chr*_*s F 21

自从我提出这个问题以来,已经有好几个月了,而不是很多回答.Samyak Bhuta和nponeccop都有很好的建议,但我想讨论我在问题中找到的答案.

以下是我在生产系统中已经确定的内容,但总是在进行进一步的改进.我希望它能帮助处于类似情况的任何人.

  1. 使用Cluster生成任意数量的子进程,以便处理多核虚拟机或物理机上的传入请求.这绑定到单个端口,使维护更容易.我的经验法则是n - 1群集工作者.您不需要Forever就可以了,因为Cluster重新生成了死亡的工作进程.要在群集父级别具有弹性,请确保使用Upstart脚本(或等效的)来守护Node.js应用程序,并使用Monit(或等效的)来监视Cluster父级的PID并在其死亡时重新生成它.您可以尝试使用Upstart的respawn功能,但我更喜欢让Monit看东西,所以我觉得最好让Monit处理respawn.

  2. 在端口80上运行每个应用服务器使用1个nginx,只需在您绑定到的任何端口(1)中反向代理到您的群集.可以使用node-http-proxy,但是nginx更加成熟,功能更强,并且在提供静态文件方面更快.运行nginx lean(不记录,不要gzip小文件)以最小化它的开销.

  3. 如上所述,在至少2个可用区域中至少具有2x服务器,如果在AWS中,使用在端口443上终止HTTPS/SSL并在HTTP端口80上与node.js应用服务器通信的ELB.ELB很简单,如果您愿意,可以让它更容易自动缩放.你可以运行多个nginx共享一个IP或循环由你的DNS提供商自己平衡,但我现在发现这有点过分.此时,您将删除每个应用服务器上的nginx实例.

我不需要WebSockets所以nginx仍然适用,当WebSockets出现时我会重新审视这个问题.

欢迎反馈.

  • 你为什么用nginx?提供静态内容或作为路由器到不同的应用服务器?如果只是提供静态内容那么为什么不是s3? (4认同)