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

时间:2011-08-31 15:15:15

标签: deployment node.js

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

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

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

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

  1. 群集是Node.js中最活跃且看似流行的多核实用程序,因此使用它在非特权端口(例如3000)上为每个应用服务器运行1个节点“群集” 。 Q1: 永远是否应该用来保持群集存活或者只是多余?
  2. 在端口80上运行的每个应用服务器使用1 nginx ,只需将代理反向代理到端口3000上的节点。 Q2: node-http-proxy 更适合这项任务,即使它没有快速gzip或服务器静态文件?
  3. 如上所述,拥有最少2x的服务器,独立服务器充当这些盒子的负载均衡器。使用监听443终止HTTPS并将HTTP传递给 Varnish ,这将绕过上述服务器的IP循环负载平衡。 问题3:应该使用 nginx 代替两者吗? 问题4:应考虑使用AWS或RackSpace负载均衡器(后者不会终止HTTPS)
  4. 一般问题:

    1. 你觉得上面有(2)的需要吗?
    2. 终止HTTPS的最佳位置在哪里?
    3. 如果将来需要 WebSockets ,您会进行哪些nginx替换?
    4. 我真的很想知道人们如何设置当前的生产环境以及他们喜欢哪种工具组合。非常感谢。

4 个答案:

答案 0 :(得分:20)

自从我提出这个问题以来已经有好几个月了,而不是很多回答。 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实例。

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

    欢迎反馈。

答案 1 :(得分:2)

您不应该打扰快速提供静态文件。如果您的负载很小 - 节点静态文件服务器就可以。如果您的负载很大 - 最好使用CDN(Akamai,Limelight,CoralCDN)。

而不是永远,你可以使用monit。

您可以使用HAProxy代替nginx。众所周知,它可与websockets配合使用。考虑代理闪存套接字,因为它们是一个很好的解决方法,直到websocket支持无处不在(请参阅socket.io)。

HAProxy支持HTTPS负载均衡,但不支持终止。您可以尝试使用stunnel进行HTTPS终止,但我认为它太慢了。

循环加载(或其他统计)平衡在实践中运行良好,因此在大多数情况下无需了解其他服务器的负载。

还考虑使用ZeroMQ或RabbitMQ进行节点之间的通信。

答案 2 :(得分:2)

这是一个很棒的主题!感谢所有提供有用信息的人。

过去几个月我一直在处理为创业公司设置基础设施的相同问题。

正如人们之前提到的,我们想要一个具有多核支持+ web套接字+ vhosts的Node环境

我们最终在本机群集模块和http-proxy之间创建了一个混合体,并称之为无人机 - 当然它是开源的:

https://github.com/makesites/drone

我们还将其作为AMI与Monit和Nginx一起发布

https://aws.amazon.com/amis/drone-server

我发现这个线程研究如何为Drone-tnx添加SSL支持以推荐ELB,但我不会依赖专有解决方案来解决这个问题。

相反,我扩展了默认代理来处理所有SSL请求。配置是最小的,而SSL请求转换为普通的http - 但我想当你在端口之间传递流量时,这是更好的...

随意查看并告诉我它是否符合您的需求。欢迎所有反馈。

答案 3 :(得分:0)

我已经看到AWS负载均衡器负载均衡和终止+ http-node-proxy用于反向代理,如果你想为每个盒子运行多个服务+ cluster.js,那么mulicore支持和进程级故障转移做得非常好。

对于你想要在故障转移方面采取极度谨慎的方法,cluster.js上的forever.js可能是一个很好的选择,但这几乎不需要。